一、what
将数组或一些元素转为集合
二、错误用法
- 将基本类型参数作为aslist的参数
int[] arr = {1, 2, 3};
List list = Arrays.asList(arr);
System.out.println(list.size()); //1
//原因:由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的,所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。
- 将数组作为asList参数后,修改数组或List
String[] strings = {"你好", "世界"};
List list = Arrays.asList(strings);
strings[0] = "你不好";
list.set(1, "yufchen");
System.out.println(Arrays.toString(strings) + list.toString());
//[你不好, yufchen][你不好, yufchen]
//由于asList产生的集合元素是直接引用作为参数的数组,所以当外部数组或集合改变时,数组和集合会同步变化
3. 数组转换为集合后,进行增删元素
list.add("新增的话");//java.lang.UnsupportedOperationException
//由于asList产生的集合并没有重写add,remove等方法,所以它会调用父类AbstractList的方法,而父类的方法中抛出的却是异常信息。
三、真相
List list = Arrays.asList(strings);
ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(strings));
DEBUG看类型.png
继承区别.png
- 长度不同 和 实现的方法不同
Arrays.ArrayList是一个定长集合,因为它没有重写add,remove方法,所以一旦初始化元素后,集合的size就是不可变的。 - 参数赋值方式不同
Arrays.ArrayList将外部数组的引用直接通过 “=” 赋予内部的泛型数组,所以本质指向同一个数组。
ArrayList是将其他集合转为数组后copy到自己内部的数组的。
四、数组转ArrayList方式
两种方式.png//既可以用于基本类型也可以返回想要的集合。
int intArray[] = {1, 2, 3};
List<Integer> arraylist = Arrays.stream(intArray)
.boxed()
.collect(Collectors.toList());
System.out.println(arraylist);
网友评论