AsList()方法詳解


AsList()方法詳解

在Java中,我們應該如何將一個數組array轉換為一個List列表並賦初始值?首先想到的肯定是利用List自帶的add()方法,先new一個List對象,再使用add()方法將數組array中的值一個一個放入。這種方法固然可行,但是比較繁瑣。那么有沒有稍微簡單一點的方法呢?Arrays.asList()方法可以作為一個解決方案。

首先放上asList()方法的源代碼,會在后續分析中使用。

使用Arrays.asList()方法時,需要注意以下幾點:

1、不支持add()、remove()、clear()等方法

使用上述方法在編譯時並不會報錯,而在運行時會拋出java.lang.UnsupportedOperationException錯誤。

import java.util.Arrays;
import java.util.List;

public class AsListTest {
    public static void main(String[] args) {
        String[] s = {"a", "b", "c"};
        List list = Arrays.asList(s);
        list.add("d");
    }
}

// 結果:
// Exception in thread "main" java.lang.UnsupportedOperationException

究其原因,是因為此方法並未創建Util包下的List實現類,而是在Arrays.java包下自定義了一個ArrayList類。如上圖所示,為asList()方法,這個類並未實現add()等方法,而是直接使用父類AbstractList的相應方法,導致報錯。因此需要注意的是,使用該方法時,不能對轉化后的List進行增加或刪除操作,只能進行讀取或修改。

2、基本數據類型數組轉換后使用size()方法時返回不正確

當數組為基本數據類型的數組時,將數組轉換為List后,使用List.size()方法獲取List長度不正確。

import java.util.Arrays;
import java.util.List;

public class AsListTest {
    public static void main(String[] args) {
        int[] i = {1, 2, 3};
        List list = Arrays.asList(i);
        System.out.println(list.size());
    }
}

// 結果:1

究其原因,是因為構造方法傳入了一個泛型數組參數,但是由於int[]本身就是一個類型,所以編譯器認為只傳了一個變量,這個變量的類型是int數組,結構為int(1)(),因此size為1。

由上述分析,因為基本數據類型數組轉換后使用size()方法時返回不正確,根據索引對轉換后List進行修改也會出現錯誤。因此,不要對基本數據類型數組進行轉換,盡量使用基本數據類型的包裝類,如:Integer等。

3、對List或Array其中一個進行修改,另一個也會相應改變

import java.util.Arrays;
import java.util.List;

public class AsListTest {
    public static void main(String[] args) {
        String[] s = {"a", "b", "c"};
        List list = Arrays.asList(s);

        s[0] = "b";
        System.out.println("Array:"+Arrays.toString(s));
        System.out.println("List:"+list);

        list.set(1, "c");
        System.out.println("Array:"+Arrays.toString(s));
        System.out.println("List:"+list);
    }
}

// 結果:
// Array:[b, b, c]
// List:[b, b, c]
// Array:[b, c, c]
// List:[b, c, c]

從上面結果可以看出,對List或Array其中一個進行修改,另一個也會相應改變。這是因為由asList()方法生成的List僅是對Array進行了一層包裝,對List進行操作實際還是對初始Array的操作。


免責聲明!

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



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