Java集合框架的坑

String[] array = new String[100];
List<String> list = Arrays.asList(array);
list.add("123"); // 这一行会报错

代码中已经加了注释,“list.add("123");”这一行会报错,报的错误是:“java.lang.UnsupportedOperationException”。这是因为Arrays.asList(...)方法返回的是一个ArrayList,但不是java.util.ArrayList。这里的ArrayList是Arrays的一个内部类,这个内部类继承自AbstractList,并且没有覆盖AbstractList的add和remove方法。

AbstractList的add和remove方法是默认抛出异常的,见下面这段代码:

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}
public E remove(int index) {
    throw new UnsupportedOperationException();
}

所以,通过Arrays.asList(...)转出来的List,是不能改变大小的(通过调用add或remove方法)。

==================================

List<String> list1 = new ArrayList<String>(10);
List<String> list2 = list1.subList(0, 5);
list2.add("123"); // 这一行会报错

上面的代码中已经指明了,“list2.add("123");”这行会报错,这是因为在底层subList方法返回的List是和原List共用一份String数组的,subList返回的的List是原List的一个视图,是不可以改变大小的。

==================================

List<String> list1 = new ArrayList<String>(0);
List list2 = list1;
list2.add(new Long(100)); // 这行不会报错
String s = (String) list2.get(0); // 这行会报错

==================================

集合转数组时,也会有一些你可能踩到的坑,就比如如下代码:

List<String> list = new ArrayList<String>(0);
list.add("abc");
String[] array = (String[]) list.toArray(); // 这一行会报错

这是因为toArray方法返回的是Object[]对象,不会因为泛型而改变。如果你确实想直接返回String[]对象,应该这么做:

List<String> list = new ArrayList<String>(0);
list.add("abc");
String[] array = list.toArray(new String[0]);

猜你喜欢

转载自blog.csdn.net/look4liming/article/details/81947416