从列表中删除值<;字符串>;在java中抛出java.lang.UnsupportedOperationException

从列表中删除值<;字符串>;在java中抛出java.lang.UnsupportedOperationException,java,list,Java,List,我想从列表中删除特定元素。我不想在遍历列表时执行此操作。我想指定必须删除的值。在javadocs中,我找到了函数List.remove(对象0)这是我的代码: String str="1,2,3,4,5,6,7,8,9,10"; String[] stra=str.split(","); List<String> a=Arrays.asList(stra); a.remove("2"); a.r

我想从列表中删除特定元素。我不想在遍历列表时执行此操作。我想指定必须删除的值。在javadocs中,我找到了函数
List.remove(对象0)
这是我的代码:

         String str="1,2,3,4,5,6,7,8,9,10";
         String[] stra=str.split(",");
         List<String> a=Arrays.asList(stra);
         a.remove("2");
         a.remove("3");
String str=“1,2,3,4,5,6,7,8,9,10”;
字符串[]stra=str.split(“,”);
列表a=Arrays.asList(stra);
a、 删除(“2”);
a、 删除(“3”);

但是我得到了一个例外:
java.lang.UnsupportedOperationException

问题是
Arrays.asList()
返回一个不支持插入/删除的列表(它只是
stra
的一个视图)

要修复、更改:

List<String> a = Arrays.asList(stra);
List a=Arrays.asList(stra);
致:

List a=newarraylist(Arrays.asList(stra));
这将创建列表的副本,允许您修改它。


看这个。Arrays.asList返回一个固定列表。这是不变的。根据定义,一旦对象创建,您就不能修改它。这就是它抛出不支持的异常的原因

它起作用了。谢谢,我的方法有什么问题。列表a=Arrays.asList(stra);这一行中没有抛出异常。@Ashwin:这一行很好。但是,
Arrays.asList()
生成的列表是只读的,因此不能修改它。你得先复印一份好的。。对于我的方法,列表是否只是直接访问字符串[]值,而不复制自己的值?因此,如果允许任何更改,它们也会影响字符串[],对吗?字符串也是不可变的。但当您修改一个字符串时,它会被分配一个新的内存位置,并且在内部会创建一个新字符串。因此,您可以有效地修改不可变字符串。所以我不认为这里的原因是返回的列表是不可变的。我认为这是因为在处理Arrays.asList()时,它只引用字符串[](不复制字符串[]并制作列表)。如果查看Arrays类中的内部类调用ArayList,您将意识到它无法修改。简单地说,它使用一个私有的最终E[]a;这就是您无法修改退货列表的原因。在字符串的情况下,一旦创建了字符串,就不能修改字符串。但在字符串类中,API的开发方式是通过创建一个新对象来处理内部修改。你是说它不引用字符串[]并存储自己的副本(但作为最终版本)?@SafeVarargs public static List asList(T…a){return new ArrayList(a);}private final E E[]a;ArrayList(E[]array){if(array==null)抛出新的NullPointerException();a=array;}我从API复制了代码。好的。。因此它确实创建了一个新的arraylist对象。但将其分配给最终的e[]。我仍然不知道为什么它在java中被声明为final。感谢您提供的信息:)
List<String> a = new ArrayList<String>(Arrays.asList(stra));