面试官问我Java数组转List的三种方式是什么?我直呼内行,太卷了

为什么类型论是函数式编程的理想基础? 函数式编程(如Haskell、Scala、OCaml)以“函数为核心”“无副作用”“不可变数据”等特性著称,但它的“安全高效”并非凭空而来——背后的关键支撑是类型论。本文将聚焦“类型论如何支撑函数式编程”,从基础概念到具体案例,解释两者的本质联系。本文将按“故事引入→核心概念解释→关系拆解→原理+代码案例→实际应用→总结”的逻辑展开,用“乐高积木”“菜谱”等比喻贯穿全文,确保抽象理论可视化。类型论:程序的“接口规则手册”,定义类型和函数的约束;函数式编程。 阅读详情

前言:

本文介绍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.UnsupportedOperationException at 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)按位或运算,然后赋值给result        
    return result;    
    }

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

方式一:不支持增删

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

运行结果:

[null, null]

方式二:支持增删

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

运行结果:

[null, null, 2]

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

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

运行结果:

[null, null, 3]

综上,整型Integer[]数组转List的正确方式应该是这样的。
易错点:可能出现的错误可能是这样转换的:

int[] intArray1 = new int[2];
List<Integer> list1 = Arrays.asList(intArray1);
//此处报错!!!

报错原因:等号两边类型不一致,当然编译不通过。分析见下文。
那么在声明数组时,用int[] 还是Integer[],哪种声明方式才能正确的转为List呢?
答案: 只能用Integer[]转List,即只能用基本数据类型的包装类型,才能直接转为List。
原因分析如下:
我们来看List在Java源码中的定义(别害怕看不懂源码,看我分析,很易懂的):\

public interface List<E> extends Collection<E> {省略…}

再来看Arrays.asList()的在Java源码定义:

 public static <T> List<T> asList(T... a) {   
     return new ArrayList<>(a);   
      }

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

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

举一反三:其他8种基本数据类型byte、short、int、long、float、double、char也都不是引用类型,所以8种基本数据类型都不能作为List的形参。但String、数组、class、interface是引用类型,都可以作为List的形参,所以存在List接口类型的集合、List<int[]>数组类型的集合、List类的集合。但不存在list、list 等基本类型的集合。

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

int[] intArray1 = new int[1]; 
Arrays.asList(intArray1);
//编译不报错List<Integer> list1 = Arrays.asList( intArray1);
//编译报错

答案:

第二行代码,Arrays.asList()方法的入参是个引用类型的int[],那么返回值类型一定是List<int[]> ,其完整代码是:List<int[]> intsArray = Arrays.asList(intArray1);,所以编译通过,没问题。

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

总结

现在你应该明白,为什么int[]不能直接转换为List,而Integer[]就可以转换为List了吧。

因为List中的泛型必须是引用类型,int是基本数据类型,不是引用类型,但int的包装类型Integer是class类型,属于引用类型,所以Integer可以作为List形参,List在java中是可以存在的,但不存在List类型。

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

在这里插入图片描述

ROS新手必看:如何用URDF快速搭建UR5机械臂模型(附完整代码) 本文为ROS新手提供了一份详细的UR5机械臂URDF建模实战指南。通过解析URDF核心概念,逐步讲解如何定义link与joint,并整合官方网格文件,最终构建出完整的、可在RViz中可视化与控制的UR5模型。文章还介绍了模型验证、调试技巧以及如何添加碰撞与惯性属性,为后续的物理仿真与算法开发奠定坚实基础。 阅读详情

相关推荐

Vector CANape的使用记录

开门见山,今天想和大家分享下CANape使用记录,分享原因是近日在分析一个客户现场软件问题时,需要用到CANape来实时的监测ECU中的变量,因为之前对CANape的认知比较浅薄,觉得标定工程师使用他就足够了,但是这次的经历让我觉得需要写点东西来记录自己学习并使用他的过程。 相信大家能够在网上找到很多关于如何使用CANape的文章,从新建Project到后面的数据的观测、保存以及回放等等。我个人也是这么学过来的,所以我不打算从那些方面着手去描述如何使用她,而是根据我的真实使用过程以及问题的抛出到如何解决来

2万+

Java中数组转List的四种方式

Java 数组转List的四种方式小结

Macrohua的博客 7万+

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5078

Java开发技巧 数组转List的四种方式总结

同时可以看的出上面如果直接使用了int[]这种基本类型,转换时并不是我们预期的int而且把int[]认为了是一个泛型中的基本类型,泛型中不支持基本数据类型,所以如果非要使用尽量转为包装类,除非只做基本的运算。即Java.util提供的Arrays中的asList方法,可以直接将一般的字符串数组以及包装类后的结果做直接转换。的返回值作为arrayList够构造方法的入参,即可构造出可以进行增删操的正常list。不支持的short[],byte[],char[]...

weixin_44131922的博客 1万+

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1590

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

java数组转List的几种方式

java数组转List的几种方式

LIKE_0217的博客 7051

从SGX到TDX:英特尔机密计算的技术演进与选型指南

本文深入解析了英特尔两代机密计算技术SGX与TDX的核心差异与选型策略。SGX提供应用级飞地隔离,安全等级高但开发复杂;TDX提供虚拟机级信任域保护,兼容性好且易于部署。文章结合金融与医疗行业实战案例,为开发者提供了清晰的选型指南,帮助根据代码可改性、安全需求、部署规模及生态成本选择最合适的机密计算方案。

java5的博客 420

Java中数组如何转list

将数组转换为List,然后使用ArrayList的构造函数创建一个新的ArrayList。新的ArrayList是可以修改的,你可以添加或删除元素。如果你需要一个可以修改的List,你需要将返回的List转换为一个新的ArrayList或其他类型的List。注意: 但是,这个List的大小是固定的,如果你尝试添加或删除元素,否则程序会抛出。方法可以将数组转换为一个固定大小的List。

weinan2087的专栏 2516

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2729

Vue3 - 详细实现调用浏览器摄像头拍照并生成图片预览,支持将抓拍的图像保存到用户本地或上传到服务器、调取前置摄像头和后置摄像头,开启摄像头并进行拍照,vue实现调用摄像头,电脑或手机调用摄像头拍照

vue3,nuxt3,摄像头,vue3网站打开摄像头拍照,vue3项目调用摄像头实现拍照功能,拍照后怎么保存,照相后上传到后端服务器,开启摄像头黑屏,如何默认后置摄像头,网页开启电脑摄像头并照相,前置拍照,vue3如何调用手机摄像头进行拍摄,拒绝权限后不再弹出了,微信公众号网页,摄像头报错,拍照左右镜像反了,浏览器不兼容怎么办,vue3调用电脑端摄像头实时拍照,解决调用摄像头权限无法弹出,打不开摄像头,Vue3如何调用手机的摄像头,调用本地摄像头实现拍照,浏览器不弹摄像头权限了,如何不使用https运行测试

🏆 前端领域优质创作者 8654

Java 数组转 List 的 4 种方式

https://blog.youkuaiyun.com/qidasheng2012/article/details/115112452前言【一】最常见方式(未必最佳)【二】数组转为List后,支持增删改查的方式【三】通过集合工具类Collections.addAll()方法(最高效)【四】Java8可通过stream流 【推荐】问题解答总结本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。通过 方式,将数组转换List后,不能对List增删,只能查改,否则

yygr的博客 6243

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 905

java全网最全面试题(2—java集合框架)

集合相关类和接口都在java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。其中Collection是集合List、Set的父接口,它主要有两个子接口:List:存储的元素有序,可重复。Set :存储的元素不无序,不可重复。Map 是另外的接口,是键值对映射结构的集合。List,也没啥好问的,但不排除面试官剑走偏锋,比如面试官也看了我这篇文章。ArrayList基于数组实现LinkedList基于双向链表实现ArrayList基于数组实现,get(intindex)可以直接通过数

2402_84344851的博客 156

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

五道口 39万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

现在你应该明白,为什么int[]不能直接转换为List,而Integer[]就可以转换为List了吧。因为List中的泛型必须是引用类型,int是基本数据类型,不是引用类型,但int的包装类型Integer是class类型,属于引用类型,所以Integer可以作为List形参,List在java中是可以存在的,但不存在List类型。在编码时,我们不光要知其然,还要知其所以然,通过分析JDK源码,才能得出一手信息,不仅了解到了如何用,还能得出为何这样用。

程序员高级码农的博客 2094

String数组转List的三种方式

1.通过Arrays.asList()方法 数组转成list后,不能对list进行增删,只能查改,否则会抛异常 @Test public void test1(){ String[] arr = {"0","1","2"}; List<String> list = Arrays.asList(arr); // 对转换后的list插入一条数据 list.add("aa"); System.out.println(list); } 会在add操作时报异常ja

minalz的博客 9万+

java中数组如何转list

所以,返回的List的泛型类型将是该基本数据类型的包装类(如Integer, Character等)。如果你希望返回的List的泛型类型就是基本数据类型,你需要自己手动转换。这个新的ArrayList是可以修改的,你可以添加或删除元素。如果你需要一个可以修改的List,你需要将返回的List转换为一个新的ArrayList或其他类型的List。但是,这个List的大小是固定的,如果你尝试添加或删除元素,会抛出。返回的是一个固定大小的List,如果你尝试修改它(例如添加或删除元素),会抛出。

wc1373的博客 1850

java中数组转为列表的几种方法,推荐第三种

  java中数组转为集合List,是很基础常见的,日常开发中也经常会用到,今天整理了下,有5种方法,先列出,再慢慢道来。 1、 List list = Arrays.asList(array); 2、new ArrayList(Arrays.asList(array)); 3、Collections.addAll(arraylist, array); 4、for(Element e :...

river106的博客 6141

java-数组转换为List集合

数组Array转集合List

qq_31532983的博客 2661

java List和数组相互转换方法

前言在java项目中数组和list集合(这里指ArrayList)经常需要互相转换,因此这里把两者互相转换的一些方法总结一下一、List转数组方法一、使用for循环 //要转换的list集合 List testList = new ArrayList(){{add(“aa”);add(“bb”);add(“cc”);}}; //初始化需要得到的数组 Stri

zjx2016的博客 23万+

Java 数组转 List 三种方式,面试必考,工作必备

点击上方“猿码天地”,选择“设为星标”回复”666“获取新整理的面试文章前言一、最常见方式(未必最佳)二、数组转为List后,支持增删改查的方式三、通过集合工具类Collections....

猿码天地 538

集合 —— 数组转列表的四种方式

由于 JDK 官方的短视,在早期,也就是 JDK1.0 时候的版本没能拥有泛型,直到 JDK 1.5 之后才引入了泛型,这个时候,JDK官方考虑到代码的兼容性问题,如果实现真的泛型的话,原先的 JDK1.0 的代码可能就无法运行了,为了保持代码的兼容性,在使用泛型的时候,在底层。这个第三方库的工具非常完善,有很多方法,不过主要有两种类型的的集合,一种为不可变集合,可以使用。其实,原因是这样的,此外,这个方法不适合基本数据类型的数组,必须要先将其转为其包装类的数组才行。int、double 和 long。

莪是男神的博客 1万+

String数组和List之间的相互转换

一、List 转为 String 数组 1、利用toArray方法(比较常用) List<String> list=new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); String[] str = list.toArray(new String[list.size()]); 2、逐个将list中的...

程序猿小张的升级路 2万+

java list 和数组互相转换的一些方法

注意,`Arrays.asList()` 方法对于原始类型数组(如 `int[]`, `double[]` 等)并不会返回一个 `List` 或 `List` 等类型的 `List`,而是会返回一个 `List` 类型的 List。- 数组 转 List:使用 `Arrays.asList()` 方法,但要注意原始类型数组的特殊情况(它们会被转换为一个包含数组的 List),并且返回的 List 是固定大小的,不能进行添加或删除元素的操作。

cheng_ji的专栏 6868

java 数组转list

使用Arrays.asList()方法是将数组转换为List的最简单方法之一。这个方法将数组的元素直接包装成List,但需要注意的是,返回的List是不可变的(不支持添加或删除元素),因为它基于数组。如果你需要一个可变的List,可以创建一个新的ArrayList并将数组元素一个一个地添加到新的ArrayList中。这将创建一个包含数组元素的新ArrayList,你可以对这个ArrayList执行添加和删除操作。无论你选择哪种方法,都可以将数组转换为List以便更方便地处理和操作数组中的元素。

sun13047140038的博客 1865
上一篇: 你真明白Java内存溢出吗?我看你就是浑水摸鱼!!!
下一篇: Java中引用数据类型和数据类型的拓展,一篇文章带你盘的明明白白!
Java大鲨鱼
博客等级 码龄5年 2211粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值