java Arrays.asList() 数组转集合

主要作用:将数组转化为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入仓得可以转为泛型),非基本类型都可以

posted on 2020-08-01 22:31  鑫男  阅读(321)  评论(0编辑  收藏  举报

导航