Arrays.asList和Lists.newList使用时的陷阱

Lists.newArrayList()和new ArrayList()的区别 写法 List<Integer> list = new ArrayList<Integer>(); List<Integer> list = Lists.newArrayList(); 结论 Lists.newArrayList()其实和new ArrayList()几乎一模一样,唯一它帮你做的(其实是javac帮你做的),就是自动推导尖括号里的数据类型。 用哪个合适 在 Java 7 之后,都允许类型推断 - 在运行时没有区别。java8 的new ArrayLi 阅读详情

 

昨天在开发中遇到一个场景,调用RPC,拿到返回结果(int[]数组),使用jackSon序列化为Json对象时,发现一个诡异的现象,在使用Lists.newArrayList和Arrays.asList将数组转为List时,转出来的对象并不是与原数组对应的一个List,二十一个很诡异的对象。后来研究一下JDK,发现了陷阱所在。

首先看一下Arrays.asList这个方法,这个方法可以将数组转成list,是JDK中java.util包中Arrays类的静态方法。

  1. public class ArraysTest {

  2. private static void asListTest(){

  3. String stringArray[]={"aa","bb","cc"};

  4. List<String> sList= Arrays.asList(stringArray);

  5. for(String str:sList){//能遍历出各个元素

  6. System.out.println(str);

  7. }

  8. System.out.println(sList.size());

  9.  
  10. System.out.println("- - - - - - - - - - -");

  11.  
  12. int intArray[]={11,22,33};

  13. List intList=Arrays.asList(intArray);

  14. for(Object o:intList){//就一个元素

  15. System.out.println(o.toString());

  16. }

  17.  
  18. System.out.println("- - - - - - - - - - -");

  19.  
  20. Integer integerArray[]={11,22,33};

  21. List<Integer> objList=Arrays.asList(integerArray); //数组里的每一个元素都是作为list中的一个元素

  22. for(int a:objList){

  23. System.out.println(a);

  24. }

  25.  
  26. System.out.println("- - - - - - - - - - -");

  27. }

  28.  
  29. public static void main(String[] args){

  30. asListTest();

  31. }

  32. }

结果如下:

  1. Connected to the target VM, address: '127.0.0.1:12064', transport: 'socket'

  2. aa

  3. bb

  4. cc

  5. 3

  6. - - - - - - - - - - -

  7. [I@2db0f6b2

  8. - - - - - - - - - - -

  9. 11

  10. 22

  11. 33

  12. - - - - - - - - - - -

  13. Disconnected from the target VM, address: '127.0.0.1:12064', transport: 'socket'

  14.  
  15. Process finished with exit code 0

当基本类型数组使用Arrays.asList方法转List时,并不能转成正常的List,随后我看了一下jdk源码,看到问题所在

  1. public static <T> List<T> asList(T... a) {

  2. return new ArrayList<>(a);

  3. }

  4.  
  5. private static class ArrayList<E> extends AbstractList<E>

  6. implements RandomAccess, java.io.Serializable

  7. {

  8. private static final long serialVersionUID = -2764017481108945198L;

  9. private final E[] a;

  10.  
  11. ArrayList(E[] array) {

  12. a = Objects.requireNonNull(array);

  13. }

  14. }

基本类型int不是对象类型,在使用Arrays.asList时,做泛型擦除时,将int[]当做对象类型,所以转成一个只有一个元素的List。在使用Arrays.asList转成的List时同样要注意,Arrays.asList返回类型为Arrays类内部定义的私有类ArrayList,并且继承与AbstractList,翻阅AbstractList源码是可以发现,是不支持add和remove操作的,也就是说Arrays.asList返回的List是个固定大小的List。

如果希望转过后的list可以支持add和remove操作,可使用如下方法:

  1. /*方法一*/

  2. ArrayList<Integer> copyArrays=new ArrayList<>(Arrays.asList(integerArray));

  3.  
  4. /*方法二*/

  5. List<Integer> integerList = new ArrayList<>();

  6. Collections.addAll(integerList, integerArray);

如果想把一个基本类型数组转化为List,可使用如下方法:

Arrays.asList(ArrayUtils.toObject(intArray));

在使用com.google.common.collect提供的jar包Lists类的Lists.newArrayList方法时,有相同的问题,如果传入基本类型数组,也无法转化成一个正常的List,这一点跟ArrayList结果是一致的。但是对象数组进行转化时,有一点不同,转成的List是支持add和remove操作的。

Java List合并全解析:从addAll到并发场景的实战指南 在Java集合框架中,List作为最常用的数据结构之一,其合并操作是数据处理的基础。从原理上讲,合并操作涉及集合的扩容机制、元素复制策略以及内存管理。在技术价值层面,高效的合并方法能显著提升程序性能,尤其在处理大数据量时避免OOM(内存溢出)问题。应用场景广泛,包括数据聚合、缓存更新、配置合并等。本文聚焦于Java List合并,深入探讨了线程安全、数据一致性等核心问题,并对比了addAll、Stream API以及CopyOnWriteArrayList等不同方案的性能差异与适用场景,为高并发环境下的集合 阅读详情

相关推荐

【Jlink & C#】通过C#实现Jlink RTT上位机的功能

某天看到安富莱家的自己开发的调试器可以实现输出中文调试信息到自己编写的Jlink RTT上位机上,觉得无比神奇,略好奇到底是如何做的,找了很久,发现其上位机的对应的实现好像也没有完全开源出来。后来经过很多搜索确认,知道了几个事实:那么有没有可能用C#来控制Jlink呢?答案是,有!!! 解决思路在于,C#调用JLinkARM.dll里面的函数 这里转载下我认为很有意义的发现结合以上的几个发现,加上我自己的测试,我把我对接JLinkARM.dll的C#接口分享出来,不保证都能用,我只是测试了几个常用的功能,R

一只爱做笔记的码农 9154

lists.newarraylist()

lists.newarraylist()和new arraylist() 区别 List<Integer> list = new ArrayList<Integer>(); List<Integer> list = Lists.newArrayList(); Lists.newArrayList() 其实和 new ArrayList() 几乎一模一样, 唯...

qq5621的博客 3万+

防火墙旁挂组网

分析拓扑结构,涉及路由器、交换机、防火墙。步骤包括基础 IP 配置、OSPF、防火墙双机热备、安全策略等。第一步,路由器配置。R5、R6 连接 ISP 和核心交换机,配置接口 IP,然后 OSPF。然后防火墙,双机热备的 HRP、VRRP,还有安全策略。接着交换机,划分 VLAN,配置 TRUNK,加入 OSPF。

weixin_73298423的博客 904

java中Lists.newArrayList和new ArrayList的详细区别?

java中Lists.newArrayList和new ArrayList的详细区别?

gb4215287的博客 7085

别再为倍福EL6021/EL6022的RS485接线头疼了!手把手教你硬件跳线与软件配置(附Modbus RTU主站例程)

本文详细解析了倍福EL6021/EL6022模块的RS485硬件跳线与软件配置方法,包括Modbus RTU主站编程实战。从端子定义、跳线操作到TwinCAT 3环境设置,提供完整的通信例程和故障排查技巧,帮助工程师快速解决工业现场通信问题。

weixin_30634661的博客 592

QGIS插件实战:用百度地图AOI数据做个城市公园分析,从下载到出图全记录

本文详细介绍了如何利用QGIS的百度地图AOI插件进行城市公园分析,从插件安装、数据获取到空间分析与可视化全流程。通过实战案例演示了公园面积统计、服务范围缓冲区分析及专题地图制作,帮助用户高效完成城市绿地评估工作。

weixin_30790841的博客 556

java集合

* 数组:只能存储单一数据类型 * 优点:线性存储 查询速度快 * 缺点:数组一旦声明长度不可修改 * List:有序可重复 * 泛型:限定数据类型 * <>钻石操作符 * ArrayList 新增、删除数据慢 查询快 * LinkedList 新增、删除数快 查询慢 public class ArraylistTest { @Test public void test() { int[] array = new int[5];

wpf1391074638的博客 1003

数控弯管机xyz转换ybc的算法_花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...

在弯管机加工中,由管子模型生成可直接进行弯管加工的YBC数据可以大大提高弯管编程过程.传统的做法是先用dxf数据文件(用autocad绘制管子的轴心线数据)转出XYZ数据,然后由XYZ数据转成YBC数据,而且大部分厂家对文件版本以及软件做管方式都有不少限制,这大大花费了用户的时间跟精力.随着企业的信息化管理以及不断的技术升级,传统用autocad线条模式来描述管子的方式正在被用户用PRO/E,UG...

weixin_29065959的博客 1969

【java学习】集合框架:Map、Collection(Set、List、Queue、Array)

建立一个第三方类并实现java.util.Comparator接口。并重写方法。Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。然后排序:Collections.sort(list, new MySort ());的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。如:定义集合形式为TreeSet ts = new TreeSet(new 第三方类());

午后阳光 5525

基于单片机的继电器参数测试系统设计

由于原有测试系统在参数设置上过于单一,在对继电器测试过程中需要多次进行器件连接,导致对其测试准确度下降,会造成继电器的二次损伤,基于单片机研究继电器参数测试系统的设计方法。在硬件设计上,构建二级模式集散控制框架,利用单片机进行数据采集和处理,满足实时继电器参数数据的同步控制;设计双极性反向比例输出电路,分别利用电极电阻对继电器两侧电压进行放大,实现继电器实时电压的检测。实验结果:以两组类型断电器为测试对象,分别连接示波器进行真实数据采集,在本文系统的应用下所得参数测试结果,与真实的数据相一致,具有实际应用效

weixin_45905610的博客 1439

Outlook邮件备份全攻略:从导出到导入的完整流程(附常见问题解决)

本文提供了一份详尽的Outlook邮件备份全攻略,涵盖从导出到导入的完整流程。重点解析了经典桌面版Outlook的.pst文件备份方法、进阶的智能筛选备份策略,以及如何通过导入恢复和工具验证确保备份可用。同时,文章还介绍了构建自动化备份体系与异地容灾的最佳实践,并附有常见问题解决方案,帮助用户建立可靠的邮件数据安全防线。

weixin_29248611的博客 900

Lists.newArrayList 和 new ArrayList区别

Lists.newArrayList 和 new ArrayList区别

учёба 2843

汇川EASY系列之以太网通讯(MODBUS_TCP做主站)

汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 3309

JAVA之list使用

import java.util.ArrayList;或者import java.util.*; 1.定义和初始化 (1)创建空列表,然后逐一添加 ArrayList L=new ArrayList(); L.add(1);L.add("abc"); (2)格式化添加 ArrayList L=new ArrayList(){add(1);add("bc");}}; (3)将Collection...

Aaron_Mars的博客 863

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Lists是google对java.util.List类的封装

这个方法在google工具类中也有,源码内容如下   public static  ArrayList newArrayList() {     return new ArrayList(); } 内容是差不多的,唯一的好处就是可以少写泛型的部分。 但这个方法却有丰富的重载:    

layman1024的博客 4257

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

lists.newarraylist()和new arraylist() 区别

lists.newarraylist()和new arraylist() 区别

shihao的博客 2350

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Lists.newArrayList()与Arrays.asList()作用

先看下面代码: public class ListsUtils { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.ad...

u010019566的博客 1万+

Java集合初始化:Lists.newArrayList vs new ArrayList()

Java集合初始化选择:Guava的Lists.newArrayList与原生new ArrayList<>()对比分析。核心区别在于依赖要求、代码简洁性和功能扩展性。Guava提供可变参数、自动泛型推导和容量优化(如newArrayListWithExpectedSize),适合复杂集合操作和Guava生态项目;而原生方式更轻量,适用于通用场景。性能基准测试显示两者接近,但Guava在初始化优化和高级功能(集合转换、分片等)上更胜一筹。选择应基于项目需求:已有Guava依赖或需要高级功能时推荐

小李同学的博客 1617

Arrays.asList() 和 new ArrayList()

前言 List集合在我们开发过程中运用的频率可以说是相当高了,List集合在面试的过程中几乎也是必问的知识点。那么,对于这么重要的内容,还是值得花时间好好研究一下的。 下面的创建的两个集合有什么不同呢? List<Integer> list1 = new ArrayList(); list1.add(1); list1.add(2); list1.add(3); Integer[] array1= {1,2,3}; List<Integer> list2 = Arrays.asLi

sjqkg21的博客 2058

list大坑请注意

第一、Arrays.asList和List.subList就是一个普通独立的ArrayList如果没有办法,使用了Arrays.asList和List.sublist,返回给其他方法时候,一定要嵌套真正的ArrayList第二、jdk提供的不可变集合非常笨重,低效,不安全,推荐使用guava不可变集合第三、不要随便在foreach增加/删除元素。...

极客鼠之家 736

ArrayList正确用法

**1.List list = new ArrayList<>(Arrays.asList(arrays)); 或 推荐使用 Guava Lists 提供的方法。2.List list = Lists.newArrayList(arrays);通过上面两种方式,我们将新的 List 集合与原始数组解耦,不再互相影响,同时由于此时还是真正的 ArrayList,不用担心 add/rem...

weixin_40751083的博客 611

java8 学习

对于java8 的一些学习Collectors.toMap:Collectors.groupingBy:Collectors.collectingAndThen:List对象中的属性以逗号分隔转字符串 Collectors.toMap: // toMap 有三个重载的方法 toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper); toMap(Func

weixin_46063418的博客 320
上一篇: @Autowired 与@Resource的区别(详细)
下一篇: 【Linux】常用指令、ps查看进程、kill杀进程、启动停止tomcat命令、查看日志、查看端口、find查找文件
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值