Java 数组转 List 的三种方式及对比

您所在的位置:网站首页 数组转list方法 Java 数组转 List 的三种方式及对比

Java 数组转 List 的三种方式及对比

2022-05-19 21:38| 来源: 网络整理| 查看: 265

0 分享至

用微信扫码二维码

分享至好友和朋友圈

推荐大家关注一个公众号

后台回复“大礼包”有惊喜礼包!

每日英文

Don't worry about what other people say behind your back. They are the people who are finding faults in your life instead of fixing the faults in their own life.

不要担心别人在你背后说什么,他们那种人总在你的生活里挑刺,而不去解决自己生活里的难题。

每日掏心话

人生的旅途中有很多风景需要欣赏,有一个人陪着慢慢地行走,会在心底里升起久违的馨暖。

责编:乐乐 | 来自:大脑补丁 链接:blog.csdn.net/x541211190/article/details/79597236

往日回顾:

正文

前言:

一.最常见方式(未必最佳)

二.数组转为List后,支持增删改查的方式

三.通过集合工具类Collections.addAll()方法(最高效)

四.Java8可通过`stream`流将3种基本类型数组转为List

补充:回答评论中的疑问

总结

前言:

本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。

一.最常见方式(未必最佳)

通过Arrays.asList(strArray)方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。

关键代码:List list = Arrays.asList(strArray);

private void testArrayCastToListError() {String[] strArray = new String[2];List list = Arrays.asList(strArray);//对转换后的list插入一条数据list.add("1");System.out.println(list);

执行结果:

Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19)at com.darwin.junit.Calculator.main(Calculator.java:44)

程序在list.add(“1”)处,抛出异常:UnsupportedOperationException。

原因解析:Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。

使用场景:Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。

二.数组转为List后,支持增删改查的方式

通过ArrayList的构造器,将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList转为java.util.ArrayList。

关键代码:ArrayList list = new ArrayList(Arrays.asList(strArray)) ;

private void testArrayCastToListRight() {String[] strArray = new String[2];ArrayList list = new ArrayList(Arrays.asList(strArray)) ;list.add("1");System.out.println(list);

执行结果:成功追加一个元素“1”。

[null, null, 1]

使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。

三.通过集合工具类Collections.addAll()方法(最高效)

通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。

关键代码:

ArrayList< String> arrayList = new ArrayList(strArray.length);Collections.addAll(arrayList, strArray);

测试:

private void testArrayCastToListEfficient(){String[] strArray = new String[2];ArrayList< String> arrayList = new ArrayList(strArray.length);Collections.addAll(arrayList, strArray);arrayList.add("1");System.out.println(arrayList);

执行结果:同样成功追加一个元素“1”。

[null, null, 1]

使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。

注:附上Collections.addAll()方法源码:

public static boolean addAll(Collection c, T... elements) {boolean result = false;for (T element : elements)result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给resultreturn result;四.Java8可通过stream流将3种基本类型数组转为List

如果JDK版本在1.8以上,可以使用流stream来将下列3种数组快速转为List,分别是int[]、long[]、double[],其他数据类型比如short[]、byte[]、char[],在JDK1.8中暂不支持。由于这只是一种常用方法的封装,不再纳入一种崭新的数组转List方式,暂时算是java流送给我们的常用工具方法吧。

转换代码示例如下:

List intList= Arrays.stream(new int[] { 1, 2, 3, }).boxed().collect(Collectors.toList());List longList= Arrays.stream(new long[] { 1, 2, 3 }).boxed().collect(Collectors.toList());List doubleList= Arrays.stream(new double[] { 1, 2, 3 }).boxed().collect(Collectors.toList());

如果是String数组,可以使用Stream流这样转换:

String[] arrays = {"tom", "jack", "kate"};List stringList= Stream.of(arrays).collect(Collectors.toList());

-----------------正文结束,以下是对评论中的问题集中回复和讲解------------------

补充:回答评论中的疑问

问题:有评论提出:数组类型如果是整型数组,转为List时,会报错?

答案:在JDK1.8环境中测试,这三种转换方式是没有问题的。放心使用。对于Integer[]整型数组转List的方法和测试结果如下:

方式一:不支持增删

Integer[] intArray1 = new Integer[2];List list1 = Arrays.asList(intArray1);System.out.println(list1);

运行结果:

[null, null]

方式二:支持增删

Integer[] intArray2 = new Integer[2];List list2 = new ArrayList(Arrays.asList(intArray2)) ;list2.add(2);System.out.println(list2);

运行结果:

[null, null, 2]

方式三:支持增删,且数据量大最高效

Integer[] intArray3 = new Integer[2];List list3 = new ArrayList(intArray3.length);Collections.addAll(list3, intArray3);list3.add(3);System.out.println(list3);

运行结果:

[null, null, 3]

综上,整型Integer[]数组转List的正确方式应该是这样的。

猜想你们遇到的问题:由于评论没有给出报错的代码,所以我猜想你们出现的错误可能是这样转换的:

int[] intArray1 = new int[2];List list1 = Arrays.asList(intArray1);//此处报错!!!

报错原因:等号两边类型不一致,当然编译不通过。分析见下文。

那么在声明数组时,用int[]还是Integer[],哪种声明方式才能正确的转为List呢?答案:只能用Integer[]转List,即只能用基本数据类型的包装类型,才能直接转为List。

原因分析如下:

我们来看List在Java源码中的定义(别害怕看不懂源码,看我分析,很易懂的):

public interface List extends Collection {省略…}

再来看Arrays.asList()的在Java源码定义:

public static List asList(T... a) {return new ArrayList(a);

从上述源码中可以看出,List声明时,需要传递一个泛型作为形参,`asList()`参数类型也是泛型中的通配类型。Java中所有的泛型必须是引用类型。

什么是引用类型?Integer是引用类型,那int是什么类型?int是基本数据类型,不是引用类型。这就是为什么java中没有List,而只有List。

举一反三:其他8种基本数据类型byte、short、int、long、float、double、char也都不是引用类型,所以8种基本数据类型都不能作为List的形参。但String、数组、class、interface是引用类型,都可以作为List的形参,所以存在List接口类型的集合、List数组类型的集合、List类的集合。但不存在list、list等基本类型的集合。

有了上述基础知识后,再来看为什么下面两行代码第二行能编译通过,第三行却编译报错?

int[] intArray1 = new int[1];Arrays.asList(intArray1);//编译不报错List list1 = Arrays.asList( intArray1);//编译报错

答案:

第二行代码,Arrays.asList()方法的入参是个引用类型的int[],那么返回值类型一定是List,其完整代码是:List intsArray = Arrays.asList(intArray1);,所以编译通过,没问题。

第三行报错,因为等号两边的类型不一致,左边:List,右边List,所以编译时就报错。

总结

现在你应该明白,为什么int[]不能直接转换为List,而Integer[]就可以转换为List了吧。因为List中的泛型必须是引用类型,int是基本数据类型,不是引用类型,但int的包装类型Integer是class类型,属于引用类型,所以Integer可以作为List形参,List在java中是可以存在的,但不存在List类型。

在编码时,我们不光要知其然,还要知其所以然,通过分析JDK源码,才能得出一手信息,不仅了解到了如何用,还能得出为何这样用。

你还有什么想要补充的吗?

PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师,在后台回复“”即可。

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。

别找了,想获取史上最简单的Java大厂面试题学习资料

扫下方二维码回复「面试」就好了

嘿,你在看吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

/阅读下一篇/ 返回网易首页 下载网易新闻客户端


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3