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