InterviewCoder
# 【Java】如何优雅的将数组转换为 List 集合
# 第一种方式 (未必最佳): 使用 ArrayList.asList (strArray)
使用 Arrays 工具类 Arrays.asList (strArray) 方式,转换完成后,只能对 List 数组进行查改,不能增删,增删就会抛出 UnsupportedOperationException 异常
1 2 3 4 5 6 7 8 9 import java.util.Arrays;import java.util.List; public static void Demo1 () { String[] str = {"fgx" , "lzy" }; List<String> ints = Arrays.asList(str); ints.add("laopo" ); }
添加数据报错:
1 2 3 4 5 6 7 8 9 10 Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148 ) at java.util.AbstractList.add(AbstractList.java:108 ) at JAVA基础.JDK8新特性.Java数组转List.Demo1(Java数组转List.java:20 ) at JAVA基础.JDK8新特性.Java数组转List.main(Java数组转List.java:13 ) 报错原因:Arrays.asList(str)返回值是java.util.Arrays类中一个私有静态内部类 java.utiil.Arrays.Arraylist,并不是我们平时用的java.util.ArrayList(); 使用场景:Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。
# 第二种方法 (支持增删查改):
通过 ArrayList 的构造器,将 Arrays.asList (strArray) 的返回值由 java.utilArrays.ArrayList 转为 java.util.ArrayList.
关键代码:ArrayList list = new ArrayList (Arrays.asList (strArray)) ;
1 2 3 4 5 String[] str = {"fgx" , "lzy" }; java.util.ArrayList<String> strings = new ArrayList <>(Arrays.asList(str)); strings.add("aop" ); strings.stream().forEach(System.out::println);
在这里插入图片描述
使用场景:需要在将数组转换为 List 后,对 List 进行增删改查操作,在 List 的数据量不大的情况下,可以使用。
# 第三种方式 (通过集合工具类 Collections.addAll () 方法 (最高效))
通过 Collections.addAll (arrayList, strArray) 方式转换,根据数组的长度创建一个长度相同的 List,然后通过 Collections.addAll () 方法,将数组中的元素转为二进制,然后添加到 List 中,这是最高效的方法。
1 2 3 4 5 6 public static void Demo3 () { String[] str = {"fgx" , "lzy" }; java.util.ArrayList<String> stringList = new ArrayList <>(str.length); Collections.addAll(stringList,str); }
# 第四种方式通过 JDK8 的 Stream 流将 3 总基本类型数组转为 List
如果 JDK 版本在 1.8 以上,使用流 stream 来将下列 3 种数组快速转为 List, 分别是 int [],long [],double [], 不支持 short [ ],byte [ ],char [] 在 JDK1.8 中暂不支持.
1 2 3 4 5 6 int [] ints = {2 , 34 , 55 , 22 , 11 }; long [] longs = {1 , 2 , 3 }; double [] doubles = {1 , 2 , 3 }; Arrays.stream(ints).boxed().collect(Collectors.toList()); Arrays.stream(longs).boxed().collect(Collectors.toList()); Arrays.stream(doubles).boxed().collect(Collectors.toList());
TIPs: 为什么 int [] 不能直接转为 List, 而 Integer [] 可以转为 List, 而 Integer [] 就可以转为 List 了,因为 List 中的泛型 必须是引用类型。
java 数组转 list 误区
一、不能把基本数据类型转化为列表
仔细观察可以发现 asList 接受的参数是一个泛型的变长参数,而基本数据类型是无法泛型化的,如下所示:
1 2 3 4 5 6 7 8 9 10 11 public class App { public static void main (String[] args) { int [] intarray = { 1 , 2 , 3 , 4 , 5 }; List< int []> list = Arrays.asList(intarray); System.out.println(list); } } output: [[I @66d3c617 ]
这是因为把 int 类型的数组当参数了,所以转换后的列表就只包含一个 int [] 元素。
解决方案:
要想把基本数据类型的数组转化为其包装类型的 list,可以使用 guava 类库的工具方法,示例如下:
1 2 int [] intArray = { 1 , 2 , 3 , 4 };List<Integer> list = Ints.asList(intArray);
二、asList 方法返回的是数组的一个视图
视图意味着,对这个 list 的操作都会反映在原数组上,而且这个 list 是定长的,不支持 add、remove 等改变长度的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class App { public static void main (String[] args) { int [] intArray = { 1 , 2 , 3 , 4 }; List<Integer> list = Ints.asList(intArray); list.set( 0 , 100 ); System.out.println(Arrays.toString(intArray)); list.add( 5 ); list.remove( 0 ); } } output: [ 100 , 2 , 3 , 4 ] UnsupportedOperationException UnsupportedOperationException
# 关于我
Brath 是一个热爱技术的 Java 程序猿,公众号「InterviewCoder」定期分享有趣有料的精品原创文章!
InterviewCoder
非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!