本文知识总结来自于:Java 集合细节(二):asList 的缺陷
首先贴一下代码:
public List<Integer> getRow(int rowIndex){
if (rowIndex == 0)
return new ArrayList<>();
int[] resArray = new int[rowIndex];
for (int i = 0; i < rowIndex; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i)
resArray[j] = 1;
else
resArray[j] += resArray[j - 1];
}
}
return new ArrayList<>(Arrays.asList(resArray));
}
编译器会提示错误:
看到提示会让人很奇怪,为什么类型变成了int[]
我们看一下
asList
源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
参数是变长的泛型参数,而基本类型是无法泛型化的,要想作为泛型参数就需要使用其包装类型。 而java中数组是一个对象,是可以泛型话的,因此这里相当于传递了一个参数,参数为int[]数组类型的对象, 我们可以做个实例
public static void main(String[] args) {
int[] ints = {1,1,1,1,1};
List list = Arrays.asList(ints);
System.out.println(list.size());
System.out.println("list 的类型:" + list.get(0).getClass());
System.out.println("list.get(0) == ints:" + list.get(0).equals(ints));
}
1
list 的类型:class [I
list.get(0) == ints:true
而是用Integer时:
public static void main(String[] args) {
Integer[] ints = {1,1,1,1,1};
List list = Arrays.asList(ints);
System.out.println(list.size());
System.out.println("list 的类型:" + list.get(0).getClass());
System.out.println("list.get(0) == ints:" + list.get(0).equals(ints));
}
5
list 的类型:class java.lang.Integer
list.get(0) == ints:false
2. 从上述链接也能看到asList
的另一缺陷: asList 产生的列表不可操作
生成的ArrayList 不是 java.util.ArrayList,他是 Arrays 的内部类。该内部类提供了 size、toArray、get、set、indexOf、contains 方法,而像 add、remove 等改变 list 结果的方法从 AbstractList 父类继承过来,而在抽象类AbstractList 中,add、remove都会抛出异常
例如:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}