java中关于遇到UnsupportedOperationException异常

来源:互联网 发布:占中事件知乎 编辑:程序博客网 时间:2024/05/20 20:57

大概的描述Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。

Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等 method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(int),add(int)等,所以throw UnsupportedOperationException。


详细解答:

示例代码

  List list = new ArrayList();
  list.add("test1");
  
  String[] array = new String[2];
  List arrayToList = Arrays.asList(array);

  List newArray = new ArrayList(arrayToList);
  newArray.add("test2");

  array[0] = "test3";
  System.out.println(arrayToList.get(0));
  arrayToList.add("test");//抛出异常‘

arrayToList.remove(arrayTolist(0));
在执行到arrayToList.add("test2")时抛出如下异常: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)


Arrays.asList返回的List内容是Array的内容引用。因为Array不能自动增大,若允许在List随便增大,那么Array的内容就不能同步最后只能让Arrays.asList返回的List不可修改,或者让返回的List与Array之间没有关系,若这样的话,对于那些很大数组来说性能上就会很有影响。

总结来说:newArray和arrayToList都是听array的摆布,然后arrayToList只是将array化了个妆,没有啥扩展功能; list对象才是拥有强大的List基因,功能强大。