前言:
一。最常见方式(未必最佳)
二。副本转为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原始码,能够获取一手信息,就能了解到了如何用,还能通过这样这样用。
希望我的解答对你有帮助,有疑惑的地方,可以在文章下方评论,我会给大家解惑的,喜欢这里请点赞和收藏。
领取专属 10元无门槛券
私享最新 技术干货