說明
asList 是 java.util.Arrays 類的一個方法
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
官方的解釋: 返回由指定數組支持的固定大小的列表,這個方法是array 和 collectionn API 之間的一個橋梁,它所返回的List 是序列化之后的,並且實現了 RandomAccess 接口
就是一個能夠快捷指定固定大小的列表,並進行初始化指定的元素
注意:這個List 返回的不是 java.util.ArrayList,而是 java.util.Arrays的一個內部類
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
參數接受的是一個數組,使用java.util.Objects 對象的requireNonNull 來判斷是否為空
如果為空則直接拋出空指針異常,此種判空方式常用於構造函數的參數判斷
基本用法
List<String> list = Arrays.asList("Apple");
asList 是一個靜態方法,能夠直接被調用,如上所示,只創建了一個叫apple的元素
List<String> list = Arrays.asList("Apple","Orange");
也可以創建多個指定元素的列表
通過以上兩種方式,我們能夠知道,asList方法能夠創建多個指定元素的列表
public class ArraysTest {
public static void main(String[] args) {
String[] array = {"Apple","Banana","Orange"};
List<String> myList = Arrays.asList(array);
for(String list : myList){
System.out.println(list);
}
}
}
----------------------------------------------------------------------輸出:------------------------------------------------------------------------------
Apple
Banana
Orange
陷阱
陷阱一:
雖然說對於Arrays.asList 能夠方便快捷的創建一個列表,但是世界上沒有完美的技術,這個方法也不例外,同樣會產生一些缺陷和漏洞:
public class ArraysTest {
public static void main(String[] args) {
int[] array = {1,2,3};
List myList = Arrays.asList(array);
System.out.println(myList.size());
}
}
----------------------------------------------------------------------輸出:------------------------------------------------------------------------------
1
這時你會很好奇,我明明創建了三個元素,為什么輸出的長度是 1 呢?
因為asList需要接收的參數是一個原始數組,所以上述代碼對它創建了一個名為"array"的列表,只有一個元素所以長度為1
System.out.println(myList.get(0))
輸出發現上面得到的並不是1 2 3 中任意的一個值,而是一個hashcode ,這就說明這個list 唯一的元素是一個array對象
陷阱二:
假如我創建了一個指定元素的list,那么我能否對這個list進行 元素添加等操作呢?
public class ArraysTest {
public static void main(String[] args) {
String[] myArray = {"Apple","Banana","Orange"};
List<String> myList = Arrays.asList(myArray);
myList.add("Pear");
}
}
運行后程序報錯,
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at Arrays.ArraysTest.main(ArraysTest.java:11)
說是不支持操作類型異常,Arrays.asList()創建完列表之后,你就不能夠再修改元素
改觀
改觀一:把私有的數組轉換為List
使用了 JDK 1.8的lambda 表達式和流
public class ArraysTest {
public static void main(String[] args) {
int[] intArray = {5, 10, 21};
List<Integer> myList = Arrays.stream(intArray).boxed()
.collect(Collectors.toList());
}
}
改觀二: 把數組轉換成List 來接受更多的元素
如上面所述,Arrays.asList()的結果不支持添加或刪除項,如果你不能接受這種行為,可以換一種方式
public class ArraysTest {
public static void main(String[] args) {
String[] myArray = {"Apple", "Banana", "Orange"};
List<String> myList = new ArrayList<>(Arrays.asList(myArray));
myList.add("Guava");
}
}
可以嘗試新new 一個ArrayList 來接受 Arrays.asList產生的結果
改觀三: 使用自己的實現將數組轉換為列表
下面是將Array轉換為List的簡單實現
public class ArraysTest {
public static void main(String[] args) {
String[] myArray = {"Apple", "Banana", "Orange"};
List<String> myList = new ArrayList<>();
for(String str : myArray){
myList.add(str);
}
System.out.println(myList.size());
}
}