Arrays.asList()
在写代码过程中也有用到将数组或其他元素转换成集合的操作。但是这个方法转换后的集合需要有一些注意的地方。
之前看过,但是时间长也有点模糊了,记下来再巩固一下。
下面看例子:
首先搞出一个字符串转换为集合
public static void main(String[] args) {
String a = "1,2,3";
List<String> stringList = Arrays.asList(a);
System.out.println(stringList);
}
输出结果为: [1,2,3] 是没有问题的
但是这个转换后的集合不能进行一些操作 比如对集合的add、remove操作:
public static void main(String[] args) {
String a = "1,2,3";
List<String> stringList = Arrays.asList(a);
// 使用add 方法
stringList.add(3,"4");
// 或者下面这个remove方法
stringList.remove(0);
System.out.println(stringList);
}
都会抛出异常:
Exception in thread "main" java.lang.UnsupportedOperationException.....
原因就在这个asList()方法里
点进方法里可以看到如下:
虽然方法里 也是new 了一个 ArrayList,但是这个ArrayList位置处于
java.util.Arrays.ArrayList
是一个固定长度集合。
这个位置和平常直接new 出来的ArrayList不同 ,并非直接处于util包下。
(new ArrayList(); ---- 位置处于 java.util.ArrayList)
这个地方的ArrayList方法如下:
继承AbstractList,实现了RandomAccess, java.io.Serializable
进入到所继承的 AbstractList里面最上面所说的 add,remove方法抛异常的地方就在这里:
因此 通过asList() 方法转换后的list 用来遍历还是可以的。
还有一种情况:
public static void main(String[] args) {
int[] arr = {1,2,3};
List<int[]> ints = Arrays.asList(arr);
}
并不能输出想要的集合,因为int基础类型不能泛型化()
会把arr当成一个元素输出 ([[I@19469ea2])
可以使用这种方法转换集合:
java集合不存储基本类型,boxed方法用于把流转换为集合
public static void main(String[] args) {
int[] arr = {1,2,3};
List<Integer> collect = Arrays.stream(arr).boxed().collect(Collectors.toList());
System.out.println(collect);
}
输出结果:[1, 2, 3]
或者说 直接用包装类定义 然后进行asList转换集合方法也可:
public static void main(String[] args) {
Integer[] arr1 = {4,5,6};
List<Integer> integers = Arrays.asList(arr1);
System.out.println(integers);
}
输出结果: [4, 5, 6]