Hi 我是小小,我们又见面了,本文主要介绍Java数组转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<String> list = new ArrayList<String>(Arrays.asList(strArray)) ;

private void testArrayCastToListRight() {String[] strArray = new String[2];ArrayList<String> list = new ArrayList<String>(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<String>(strArray.length);
Collections.addAll(arrayList, strArray);

测试:

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

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

[null, null, 1]

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

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

public static <T> boolean addAll(Collection<? super T> c, T... elements) {boolean result = false;for (T element : elements)result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给resultreturn result;}

一些简单疑问

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

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

方式一:不支持增删

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

运行结果:

[null, null]

方式二:支持增删

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

运行结果:

[null, null, 2]

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

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

运行结果:

[null, null, 3]

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

关于作者

我是小小,一个佛系的程序员,我们下期再见。

小明菜市场

推荐阅读

● 面试官 | 这位连单点登录都不知道,让他回家等通知去吧

● 问题解决 | maven包冲突了怎么办,这款插件你不容错过

● 必知必会 | 关于Redis缓存这三大问题,必知必会

● 必备收藏 |详解 | 求你别用效率低下的I/O了,要不试试这种I/O

● 明了 | 看了这篇文章,多年不能理解的分布式事物,终于看懂了!

给我个好看再走好吗?

面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了相关推荐

  1. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

  2. 面试官最讨厌的三种求职者

    职场人士在职业职业生涯中一定会面临求职和面试,想要面试过关需要三个条件:职业技能达标.问题回答得体.不犯致命错误.前两点很好理解,我们来看看第三个,面试过程中有些致命的错误表现,会让面试官反感,直接毙 ...

  3. Java循环的三种方式分享

    转自: Java循环的三种方式分享 下文笔者讲述java循环的三种方式分享,如下所示 一.while循环 while语法:while(循环条件){循环体}while关键字处理循环先判断循环条件当条件成 ...

  4. java实现线程三种方式_详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

  5. java反射的三种方式以及一些常用方法

    1.获取类的三种方式 第一种:使用Class.forName(String classPath) //ClassPath:写需要反射的类名,一般是以包名.类名 注意事项:这里会产生一个ClassNot ...

  6. Jmeter引用外部Java文件的三种方式

    首先,我们来了解一下Jmeter引用外部Java文件的应用场景:说一个最常见的场景,比如做接口测试时,登录接口密码为加密传输,加密的算法由后端开发提供,只要后端开发语言是Java,那么他提供给你的加密 ...

  7. java深拷贝的三种方式

    问题:spring boot/JPA项目中,修改某个对象以后需要生成一个VO对象给客户端,数据库对应的POJO对象里有个Map类型的对象(名字叫para),这个对象的value又是个Map,我使用Ma ...

  8. java字符串反转三种方式

    将一个字符串进行反转.将字符串中指定部分进行反转.比如"abcdefg"反转为"abfedcg". public class StringDemo {/*将一个 ...

  9. Java数组初始化三种方式

    初始化方式: 静态初始化 int[] intArr; intArr = new int[]{1,2,3,4,5,9}; 简化的静态初始化方式 String[] strArr = {"张三&q ...

最新文章

  1. 前端每日实战:93# 视频演示如何用纯 CSS 创作一根闪电连接线
  2. 关于addEventListener和attachEvent的初步探讨
  3. 数据中心更新那么快,运维人如何度过35岁危机?
  4. 细说HTML元素的ID和Name属性的区别
  5. Android 判断当前联网的类型 wifi、移动数据流量
  6. leetcode 388. Longest Absolute File Path | 388. 文件的最长绝对路径(栈+DFS)
  7. 实现物联网项目,你需要提前知道的6件事情
  8. javafx 项目_JavaFX,Jigsaw项目和JEP 253
  9. MFC处理回车窗口消失
  10. Exynos4412 所用内存 —— DDR2
  11. 分布式开放 消息系统 (RocketMQ) 的原理与实践
  12. 珍爱生命,远离大厂政治斗争
  13. python怎么导出程序_[272]如何把Python脚本导出为exe程序
  14. jquery click()方法模拟点击事件对a标签不生效的解决办法
  15. lintcode-76-最长上升子序列
  16. PyTorch学习—20.模型的微调(Finetune)
  17. 只有极少数人能通过的「超级多任务」测试(文末附测试地址)
  18. BootStrap的应用——实现黑马旅游网页面
  19. 树莓派4B使用移远EC20带GPS 4G模块ppp拨号上网
  20. C语言实现编译原理的LR分析法,编译原理LR(0)分析器(C语言).pdf

热门文章

  1. 你的手机支持5Gwifi吗?5G上网真的很快吗?
  2. Innodb中的buffer poll和redo undo log
  3. 分享一本Swift好书
  4. VRRP和HSRP在企业网中的应用
  5. 开启Cisco交换机DHCP Snooping功能
  6. 嘿嘿~~大家一起来测测自己反映速度
  7. oracle出现12505错误的解决步骤
  8. 计算机c语言期末答案,大学计算机C语言期末考试试题A.doc
  9. 【kubernetes系列】Pod篇实战操作
  10. linux常用翻页,20150823-Linux常用命令