来源:https://s.yam.com/6wu6n

前言:

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

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

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

关键代码:

执行结果:

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

原因解析:

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

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

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

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

关键代码:

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

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

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

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

关键代码:

测试:

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

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

注:附上方法源码:

问题解答

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

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

方式一:不支持增删

运行结果:

方式二:支持增删

运行结果:

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

运行结果:

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

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

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

那么在声明数组时,用 还是,哪种声明方式才能正确的转为呢?

答案: 只能用转,即只能用基本数据类型的包装类型,才能直接转为。

原因分析如下:

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

再来看的在Java源码定义:

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

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

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

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

答案:

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

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

总结

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

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

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

java 数组 源码_Java数组转List的三种方式及对比相关推荐

  1. java数组排序源码_Java 数组工具类排序,最大值最小值等

    public class ArrayUtils{ /** * 返回数组最大值 * * @param a * @return */ public static int max(int[] a){ // ...

  2. android double转string_Java 数组转 List 的三种方式及对比

    来源:Java数组转List的三种方式及对比_五道口-CSDN博客 作者:大脑补丁 前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解 ...

  3. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  4. java解析遍历List集合(其实现子类)的三种方式

    java解析遍历List集合(其实现子类)的三种方式 1 使用迭代器对象 1.1 底层 1.1.1 List接口继承了Collection接口 1.1.2 而Collection接口又继承了Itera ...

  5. java商城源码_java 多商户商城系统源码分享

    三勾商城多商户是开发友好的微信小程序商城,框架支持SAAS,支持发布 iOS + Android + 公众号 + H5 + 各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)等多个平台,不可多得 ...

  6. java反射源码_java反射技术详解附源码

    在学校学习Java时,由于学的不扎实,也没经历过太多实战项目,所以很多重要的知识点瞟一眼就过去了,比如现在要讲的反射,当时直接就忽略掉了,可现在发现很多地方需要反射,不得不重新学习一下,上学欠了太多债 ...

  7. java 时间戳 对比_Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System ...

  8. java获取小程序中用户的unionId的三种方式

    前提条件: 想要获取unionId,必须几个小程序或者公众号在同一个主体之下,要不然没有unionId,只会生成用户的openid,可登陆下面这个微信官方平台查看 https://open.weixi ...

  9. java linkedlist源码_Java集合之LinkedList源码分析

    一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...

最新文章

  1. 算法练习----java字符全排列
  2. python3 windows环境 安装加密库 crypto
  3. 2020-10-27(dex文件解析)
  4. 解决 swap file “*.swp”already exists!问题
  5. (后端)解决code唯一码(java)简便方法
  6. Session一次错误记录
  7. 执行引擎(Execution Engine)总结
  8. BT5的默认用户名和密码
  9. java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.FileSplit cannot be cast to...
  10. 智能机器人建房子后房价走势_重磅!机器人建房时代将至,工作效率是人的4倍,有助房价下跌?...
  11. 用PyAV完成视频解码之后,如何完成视频分辨率的转换?
  12. 【数据库基础】数据库的视图操作
  13. 软件测试 前置条件是什么意思,测试用例的前置条件
  14. 大数据------维度表,事实表
  15. responseBean
  16. 腾讯财报:2018年Q3腾讯净利润197.1亿元 同比增长15%
  17. USB串口导致鼠标乱跳
  18. HijackThis日志细解【简明教程增强版】(二)
  19. QT ubuntu打包发布程序
  20. 套娃的小熊(Russian Dolls)

热门文章

  1. C++ 标准库 —— random
  2. 数据源中没有 datarow_Power BI Desktop 中的数据源
  3. python画3d图-Python 竟能绘制如此酷炫的三维图
  4. 自学python-自学python编程的方法路线
  5. 线上python课程一般多少钱-培训python多少钱 ?
  6. python语言-python语言的有何特点?
  7. 在线语音识别_腾讯云在线语音识别_在线语音识别成文字 - 云+社区 - 腾讯云
  8. 亚马逊新专利:Alexa可根据用户的语音识别疾病或抑郁
  9. php获取用户当前坐标,web端定位:获取当前地理位置
  10. python中装饰器的作用_Python中装饰器的用法