主要作用:将数组转化为List
使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合。
而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比较更方便的打印函数Arrays.toString(),于是打印不再使用asList(),而asList()恰巧可用于将数组转为集合。
错误一
如果你这样使用过,那你可要注意了。
将基本类型数组作为asList的参数
int[] arr = {1,2,3}; List list = Arrays.asList(arr); System.out.println(list.size());
由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的,所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。
错误二
将数组作为asList参数后,修改数组或List
String[] arr = {"欢迎","关注","Java"}; List list = Arrays.asList(arr); arr[1] = "爱上"; list.set(2,"我"); System.out.println(Arrays.toString(arr)); System.out.println(list.toString());
由于asList产生的集合元素是直接引用作为参数的数组,所以当外部数组或集合改变时,数组和集合会同步变化,这在平时我们编码时可能产生莫名的问题。
错误三
数组转换为集合后,进行增删元素
String[] arr = {"欢迎","关注","Java"}; List list = Arrays.asList(arr); list.add("新增"); list.remove("关注"); System.out.println(list.toString());
由于asList产生的集合并没有重写add,remove等方法,所以它会调用父类AbstractList的方法,而父类的方法中抛出的却是异常信息。
解释:
其实该方法返回的,不是我们以为的集合 ArrayList, 而是 Arrays的一个静态内部类 java.util.Arrays.ArrayList
Arrays.ArrayList 是工具类 Arrays 的一个内部静态类,它没有完全实现List的方法,所以不支持add,remove等这些方法,
而正常的ArrayList直接实现了List 接口,实现了List所有方法。
一些常见的数组转集合的用法
支持基本类型的方法
1 如果使用Spring
int[] a = {1,2,3}; List list = CollectionUtils.arrayToList(a); System.out.println(list);
2 如果使用Java 8
int intArray[] = {1, 2, 3}; List iList = Arrays.stream(intArray) .boxed() .collect(Collectors.toList()); System.out.println(iList);
数组转ArrayList
1遍历转换
Integer intArray[] = {1, 2, 3}; ArrayList aList = new ArrayList< for (Integer i: intArray){ aList.add(i); }
显然这种方式不够优雅!反正我不愿意使用。
2 使用工具类
上面方案不够优雅,那么这种相对来说优雅一些。
List list = new ArrayList(); Collections.addAll(list, "welcome", "to", "china");
其实它内部实现机制,也是遍历元素,一个个往集合里加
3 两个集合类结合
将Arrays.asList返回的集合作为ArrayList的构造参数
ArrayList arrayList = new ArrayList(Arrays.asList("welcome", "to", "china"));
当然此处肯定不能是基本类型的数组了(asList入仓得可以转为泛型),非基本类型都可以