本文知識總結(jié)來自于:Java 集合細(xì)節(jié)(二):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);
}
參數(shù)是變長的泛型參數(shù)规阀,而基本類型是無法泛型化的弊决,要想作為泛型參數(shù)就需要使用其包裝類型。 而java中數(shù)組是一個對象,是可以泛型話的投慈,因此這里相當(dāng)于傳遞了一個參數(shù)惶我,參數(shù)為int[]數(shù)組類型的對象妈倔, 我們可以做個實(shí)例
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時(shí):
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 產(chǎn)生的列表不可操作
生成的ArrayList 不是 java.util.ArrayList,他是 Arrays 的內(nèi)部類绸贡。該內(nèi)部類提供了 size盯蝴、toArray、get听怕、set捧挺、indexOf、contains 方法尿瞭,而像 add闽烙、remove 等改變 list 結(jié)果的方法從 AbstractList 父類繼承過來,而在抽象類AbstractList 中声搁,add黑竞、remove都會拋出異常
例如:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}