簡(jiǎn)介:
將一個(gè)數(shù)組轉(zhuǎn)換為 List 以便進(jìn)行更豐富的操作
坑
坑一: 將原生數(shù)據(jù)類型數(shù)據(jù)的數(shù)組作為參數(shù)
public class Main {
public static void main(String[] args) {
int[] test = new int[]{1,2,3,4};
List list = Arrays.asList(test);
System.out.println(list.size());
System.out.println(list);
/*
1
[[I@45ee12a7]
*/
}
}
嘗試使用IDEA自動(dòng)修復(fù)看看它傳入的類型:居然是int[]


也就是說(shuō)T是數(shù)組元素的 class
如果你對(duì)反射技術(shù)比較了解的話,那么 class 的含義想必是不言自明。我們知道任何類型的對(duì)象都有一個(gè) class 屬性,這個(gè)屬性代表了這個(gè)類型本身。原生數(shù)據(jù)類型,比如 int,short,long等,是沒(méi)有這個(gè)屬性的,具有 class 屬性的是它們所對(duì)應(yīng)的包裝類 Integer,Short,Long。
??因此,這個(gè)錯(cuò)誤產(chǎn)生的原因可解釋為:asList 方法的參數(shù)必須是對(duì)象或者對(duì)象數(shù)組,而原生數(shù)據(jù)類型不是對(duì)象——這也正是包裝類出現(xiàn)的一個(gè)主要原因。當(dāng)傳入一個(gè)原生數(shù)據(jù)類型數(shù)組時(shí),asList 的真正得到的參數(shù)就不是數(shù)組中的元素,而是數(shù)組對(duì)象本身!此時(shí)List 的唯一元素就是這個(gè)數(shù)組。
解決方案:使用包裝類數(shù)組或使用流轉(zhuǎn)換為L(zhǎng)ist
1.
public class Main {
public static void main(String[] args) {
Integer[] test = new Integer[]{1,2,3,4};
List list = Arrays.asList(test);
System.out.println(list.size());
System.out.println(list);
/*
4
[1, 2, 3, 4]
*/
}
}
2.
public class Main {
public static void main(String[] args) {
int[] test = new int[]{1,2,3,4};
//Java 8 新引入的 Stream 操作 要將一個(gè)原始類型流轉(zhuǎn)換成一個(gè)對(duì)象流,可以使用boxed方法
List myList = Arrays.stream(test).boxed().collect(Collectors.toList());
System.out.println(myList.size());
System.out.println(myList);
/*
4
[1, 2, 3, 4]
*/
}
}
坑二:試圖修改 List 的大小
public class Main {
public static void main(String[] args) {
Integer[] test = new Integer[]{1,2,3,4};
List list = Arrays.asList(test);
Integer a = new Integer(1);
list.add(a);
//Exception in thread "main" java.lang.UnsupportedOperationException
}
}
直接報(bào)錯(cuò)
向 list 添加新元素是不被允許的;
如果試圖從 myList 中刪除元素,也會(huì)拋出相同的異常。為什么會(huì)如此?
官方指出有一句話:
Arrays.asList返回一個(gè)由指定數(shù)組生成的固定大小的 List。
查看相關(guān)的源碼

方法中的的確確生成了一個(gè) ArrayList 再點(diǎn)進(jìn)去看

有一個(gè)被聲明為 final 的數(shù)組 a ,所有傳入的元素都會(huì)被保存在這個(gè)數(shù)組 a 中。到此,謎底又揭曉了: asList 方法返回的確實(shí)是一個(gè) ArrayList ,但這個(gè) ArrayList 并不是 java.util.ArrayList ,而是 java.util.Arrays 的一個(gè)內(nèi)部類。這個(gè)內(nèi)部類用一個(gè) final 數(shù)組來(lái)保存元素,因此用 asList 方法產(chǎn)生的 ArrayList 是不可修改大小的。這里記住最后是一個(gè)final數(shù)組保存的元素
與下面final修飾區(qū)分
final List<Integer> list1 = new ArrayList<>();
list1.add(new Integer(1));
list1.add(new Integer(2));
System.out.println(list1);
//[1,2]
解決方案:創(chuàng)建一個(gè)真正的 ArrayList
Integer[] test = new Integer[]{1,2,3,4};
List list = new ArrayList(Arrays.asList(test));
list.add(new Integer(5));
System.out.println(list);
//[1, 2, 3, 4, 5]