list操作 出UnsupportedOperationException异常
这两天遇见的问题,感觉说的对,纠结半天了
我们在使用collection框架code时,会时常遇到UnsupportedOperationException异常,有些人很不了解为什么抛出这个异常,会很郁闷,但是那些只知道code的代码工人不会想这些问题。下面我作一下解释,可能也不是很正确。其实我们主要的疑惑可能是:java既然提供了这个方法,为什么我们调用要抛出异常,说不支持这个操作。我们先看一段代码:
List list1 = new ArrayList(); list1.add("test"); String[] array = new String[2]; List list2 = Arrays.asList(array); List list3 = new ArrayList(list2); list3.add("test"); array[0] = "test2"; System.out.println(list2.get(0)); list2.add("test");//抛出异常 在执行到l2.add("test")时抛出如下异常: test2 Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:151) at java.util.AbstractList.add(AbstractList.java:89) at TesException.main(TesException.java:20)
解释如下:
上面代码中list1是用正常方式下创建的List,可以增删内容
而 list2是一个固定大小的List,不可以对其进行进行修改操作,对array的任何操作,若想修改list3的内容,只能通过修改其对应的 array,从上面这一点也是可以看出的(关于这些解释可以参看api文档)。那么为什么会这样呢,其实List结构按是否可修改也是可以在分为两个类型 的,但是collection框架已经有太多的接口类型了,若在对每种接口类型都分出一个unmodifiable类型的接口,那么最后 collection框架会更大,对于学习与使用都会需要记住更多的接口。所以我想这样做的关键一点是:统一接口,减少开发人员的负担。但是若文档中没有对这一点说清楚,有些喜欢刨根问题的程序员会很郁闷。
我 猜测Arrays.asList返回的List内容是Array的内容引用。若可以在List中修改,那么怎么同步呢?因为它们有一个本质的区别 Array不能自动增大,若允许在List随便增大,则与其相应的Array的内容怎么保证不可修改呢?他们之间有一个阻抗。最后权衡一下,只能让 Arrays.asList返回的List不可修改,或者让返回的List与Array之间没有关系,若这样的话,对于那些很大数组来说性能上就会很有影 响。
上一篇: 快速了解PHP的面向对象
推荐阅读
-
Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析
-
String数组转化List数组之java.lang.UnsupportedOperationException异常问题
-
list操作 出UnsupportedOperationException异常
-
list操作 出UnsupportedOperationException异常
-
字符串操作异常-----java.lang.UnsupportedOperationException: null
-
(转)[Java] Java中List.remove报UnsupportedOperationException异常