【Java】如何优雅的将数组转换为List集合

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不是Collections包内的List,而是util包里面的List接口
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"};
//注意这个List不是Collections包内的List,而是util包里面的List接口
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() {
//注意这个List不是Collections包内的List,而是util包里面的List接口
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<Integer> list = Arrays.asList(intarray); 编译通不过
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

非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!

评论