Arrays.asList基本用法


說明

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());
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM