面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了
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三种方式,你说说吧。我。。懵逼。啥时候有三种了相关推荐
- Java操作Excel三种方式POI、Hutool、EasyExcel
Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...
- 面试官最讨厌的三种求职者
职场人士在职业职业生涯中一定会面临求职和面试,想要面试过关需要三个条件:职业技能达标.问题回答得体.不犯致命错误.前两点很好理解,我们来看看第三个,面试过程中有些致命的错误表现,会让面试官反感,直接毙 ...
- Java循环的三种方式分享
转自: Java循环的三种方式分享 下文笔者讲述java循环的三种方式分享,如下所示 一.while循环 while语法:while(循环条件){循环体}while关键字处理循环先判断循环条件当条件成 ...
- java实现线程三种方式_详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
- java反射的三种方式以及一些常用方法
1.获取类的三种方式 第一种:使用Class.forName(String classPath) //ClassPath:写需要反射的类名,一般是以包名.类名 注意事项:这里会产生一个ClassNot ...
- Jmeter引用外部Java文件的三种方式
首先,我们来了解一下Jmeter引用外部Java文件的应用场景:说一个最常见的场景,比如做接口测试时,登录接口密码为加密传输,加密的算法由后端开发提供,只要后端开发语言是Java,那么他提供给你的加密 ...
- java深拷贝的三种方式
问题:spring boot/JPA项目中,修改某个对象以后需要生成一个VO对象给客户端,数据库对应的POJO对象里有个Map类型的对象(名字叫para),这个对象的value又是个Map,我使用Ma ...
- java字符串反转三种方式
将一个字符串进行反转.将字符串中指定部分进行反转.比如"abcdefg"反转为"abfedcg". public class StringDemo {/*将一个 ...
- Java数组初始化三种方式
初始化方式: 静态初始化 int[] intArr; intArr = new int[]{1,2,3,4,5,9}; 简化的静态初始化方式 String[] strArr = {"张三&q ...
最新文章
- 前端每日实战:93# 视频演示如何用纯 CSS 创作一根闪电连接线
- 关于addEventListener和attachEvent的初步探讨
- 数据中心更新那么快,运维人如何度过35岁危机?
- 细说HTML元素的ID和Name属性的区别
- Android 判断当前联网的类型 wifi、移动数据流量
- leetcode 388. Longest Absolute File Path | 388. 文件的最长绝对路径(栈+DFS)
- 实现物联网项目,你需要提前知道的6件事情
- javafx 项目_JavaFX,Jigsaw项目和JEP 253
- MFC处理回车窗口消失
- Exynos4412 所用内存 —— DDR2
- 分布式开放 消息系统 (RocketMQ) 的原理与实践
- 珍爱生命,远离大厂政治斗争
- python怎么导出程序_[272]如何把Python脚本导出为exe程序
- jquery click()方法模拟点击事件对a标签不生效的解决办法
- lintcode-76-最长上升子序列
- PyTorch学习—20.模型的微调(Finetune)
- 只有极少数人能通过的「超级多任务」测试(文末附测试地址)
- BootStrap的应用——实现黑马旅游网页面
- 树莓派4B使用移远EC20带GPS 4G模块ppp拨号上网
- C语言实现编译原理的LR分析法,编译原理LR(0)分析器(C语言).pdf