在 Arrays 中有一个静态方法 asList(),可以将数组转为 ArrayList。但是这个 ArrayList,和我们平常 new 出来的集合,有点不太一样,坑比较多。
add()
Arrays.asList() 返回的 ArrayList 对象,继承 AbstractList。且没有重写 add() 方法。AbstractList 对象的 add() 方法是不支持的操作。 所以 Arrays.asList() 返回的 ArrayList,不支持 remove() 方法。
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
remove()
Arrays.asList() 返回的 ArrayList 对象,继承 AbstractList。且没有重写 add() 方法。AbstractList 对象的 remove() 方法是不支持的操作。 所以 Arrays.asList() 返回的 ArrayList,不支持 remove() 方法。
public E remove(int index) {
throw new UnsupportedOperationException();
}
clear()
Arrays.asList() 返回的 ArrayList 对象,继承 AbstractList。且没有重写 remove() 方法。AbstractList 对象的 clear() 方法实现中,有调用 remove() 方法。 所以 Arrays.asList() 返回的 ArrayList,不支持 clear() 方法。
protected void removeRange(int fromIndex, int toIndex) {
ListIterator<E> it = listIterator(fromIndex);
for (int i=0, n=toIndex-fromIndex; i<n; i++) {
it.next();
it.remove();
}
}
基本类型数组当入参
我们先来看一段代码
public static void main(String[] args) {
int[] arr = {1,2,3,4};
List integers = Arrays.asList(arr);
System.out.println(integers);
}
上述代码,输出是
[[I@52af6cff]
Array.asList(T… a) 源码我们可以看到返回的 Arrays 的内部类 ArrayList 构造方法接收的是一个类型为 T 的数组,而基本类型是不能作为泛型参数的,所以这里参数 a 只能接收引用类型。
而我们这里传入的是int[],基本数据类型 int 不是一个具体的对象T,所以这里的 a 其实是一个数组对象。
故我们传递进入的是一个数组对象,所以就把数组对象地址打印出来了。
要想修改这个问题很简单,将 int[] 换成 Integer[] 即可。所以原始类型不能作为 Arrays.asList 方法的参数,否则会被当做一个参数。