Java類庫系列--Arrays

asList

數組/多個類都可以

package org.example.a;

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

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException {
        String s1 = "abcd";
        String s2 = "efg";
        String[] strings = {"hi", "jk", "lm"};
        List<String> list1 = Arrays.asList(s1, s2);
        List<String> list2 = Arrays.asList(strings);
        //下邊這樣就不可以了
        //List<String> list3 = Arrays.asList(s1, s2, strings);

        System.out.println(list1);
        System.out.println(list2);
    }
}

執行結果

[abcd, efg]
[hi, jk, lm]

不能使用基礎數組

package org.example.a;

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

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException {
        int[] a = {1, 2, 3};
        List<String> list1 = Arrays.asList(a);

        System.out.println(list1);
    }
}

執行結果

不支持增刪,元素共享

Arrays$ArrayList:不支持增刪操作;共享原始數據(Arrays$ArrayList元素與Arrays的數組元素是共享的)。

源碼(增加)

package org.example.a;

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

public class Demo {
    public static void main(String[] args) {
        String[] strings = {"1", "2", "3"};
        List<String> list = Arrays.asList(strings);
        list.add("abc");
        System.out.println(list);
    }
}

運行結果

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at org.example.a.Demo.main(Demo.java:10)

分析

Arrays#asList 返回的 ArrayList 只是 Arrays 一個內部類,並非真正的 java.util.ArrayList

 java.util.ArrayList和Arrays$ArrayList都繼承自 AbstractList。而 java.util.Arrays$ArrayList 並沒有重寫父類的add/remove方法。而父類方法恰恰都會拋出 UnsupportedOperationException

源碼(修改)

package org.example.a;

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

public class Demo {
    public static void main(String[] args) {
        String[] strings = {"1", "2", "3"};
        List<String> list = Arrays.asList(strings);
        list.set(0, "modify_1");
        strings[1] = "modify_2";
        System.out.println(list);
    }
}

執行結果

[modify_1, modify_2, 3]

原因

查看 java.util.Arrays$ArrayList 實現,我們可以發現底層實際使用了原始數組。

解決方法

法1:外邊套一層ArrayList

List<String> list = new ArrayList<>(Arrays.asList(arrays));

法2:使用谷歌的Guava包的Lists.newArrayList

List<String> list = Lists.newArrayList(arrays);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章