首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

前言:

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

二。副本转为List后,支持增删改查的方式

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

问题解答

前言:

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

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

通过方式,将列表转换为列表后,不能对列表增删,只能查改,否则抛异常。

关键代码:

执行结果:

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

原因解析:

返回值是类中一个私有静态内部类,它并非类。类具有set(),get(),contains()等方法,但是不具有添加或删除方法,所以调用方法会报错。

使用场景:方式仅能用在将转换转换为列表后,不需要增加删除其中的值,仅作为数据源读取使用。

二。副本转为List后,支持增删改查的方式

通过ArrayList的构造器,将的返回值由转为。

关键代码:

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

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

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

通过方式转换,根据副本的长度创建一个长度相同的列表,然后通过方法,将数组中的元素转换为二进制,然后添加到列表中,这是最高效的方法。

关键代码:

测试:

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

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

注:附上方法源码:

问题解答

问题:列表类型如果是整型矩阵,转为List时,会报错?

答案:在环境中测试,这三种转换方式是没有问题的。放心使用。对于整型表格转列表的方法和测试结果如下:

方式一:不支持增删

运行结果:

方式二:支持增删

运行结果:

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

运行结果:

综上,整型副本转的正确方式应该是这样的。

易错点:可能出现的错误可能是这样转换的:

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

那么在声明清单时,用还是,某些声明方式才能正确的转为呢?答案:只能用转,即只能用基本数据类型的包装类型,才能直接转为。

原因分析如下:

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

再来看的在Java原始码定义:

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

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

举一反三:其他8种基本数据类型。也都不是引用类型,所以8种基本数据类型都不能作为目录的形参但的英文引用类型,都可以作为列表的形参,所以存在接口类型的集合,数组类型的集合,类的集合。但不存在,等基本类型的集合。

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

答案:

第二行代码,方法的入参是一个引用类型的,那么返回值类型一定是,其完整代码是:,所以编译通过,没问题。

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

总结

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

在编码时,我们不光要知其然,还要知其所以然,通过分析JDK原始码,能够获取一手信息,就能了解到了如何用,还能通过这样这样用。

希望我的解答对你有帮助,有疑惑的地方,可以在文章下方评论,我会给大家解惑的,喜欢这里请点赞和收藏。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201115A06PC300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券