当前位置: 首页 > news >正文

Arrays.asList和 List<String> list = new ArrayList<>();有什么区别

在 Java 中,Arrays.asList(...)new ArrayList<>(...) 都可以用来创建列表(List),但它们之间存在显著的区别。下面是对两者的主要区别进行的对比分析:


✅ 1. 可变性不同

特性Arrays.asList(...)new ArrayList<>(...)
是否可变❌ 不可变(大小不可变)✅ 可变
是否支持添加/删除元素❌ 抛出 UnsupportedOperationException✅ 支持

示例:

List<String> list1 = Arrays.asList("a", "b", "c");
list1.add("d"); // 报错:java.lang.UnsupportedOperationExceptionList<String> list2 = new ArrayList<>(Arrays.asList("a", "b", "c"));
list2.add("d"); // 成功

原因:

  • Arrays.asList(...) 返回的是一个固定大小的 List 实现类java.util.Arrays.ArrayList),不是 java.util.ArrayList
  • 它只是一个数组的封装视图,不能改变长度。

✅ 2. 底层实现不同

属性Arrays.asList(...)new ArrayList<>()
实现类java.util.Arrays.ArrayListjava.util.ArrayList
内部结构直接引用传入的数组内部新建数组并复制数据

示例:

String[] arr = {"a", "b"};
List<String> list1 = Arrays.asList(arr);
arr[0] = "c";
System.out.println(list1); // 输出 [c, b]List<String> list2 = new ArrayList<>(Arrays.asList("a", "b"));
arr[0] = "x";
System.out.println(list2); // 输出 [a, b]

✅ 3. null 元素处理

情况Arrays.asList(...)new ArrayList<>()
支持 null 吗?✅ 支持✅ 支持
null 数组传入❌ 抛出 NullPointerException❌ 抛出 NullPointerException

示例:

List<String> list1 = Arrays.asList(null, "a"); // OK
List<String> list2 = new ArrayList<>(Arrays.asList(null, "a")); // OKList<String> list3 = Arrays.asList((String[]) null); // NullPointerException

✅ 4. 性能与用途场景

场景推荐方式
仅做读取操作、性能敏感Arrays.asList(...)(轻量级封装)
需要频繁增删改new ArrayList<>()
转换为真正的可变 Listnew ArrayList<>(Arrays.asList(...))

✅ 5. 使用建议总结

使用目的推荐写法
快速构建只读列表Arrays.asList(...)
构建可变列表new ArrayList<>(...)
将数组转为可变列表new ArrayList<>(Arrays.asList(...))
多线程或频繁修改new ArrayList<>(...) 或其他并发容器

✅ 在你的代码中的使用

你当前的代码中:

cBean.setQueueCodeList(new ArrayList<>(cBean.getQueueCodeList()));

这是一个非常合理的做法,因为:

  • getQueueCodeList() 返回的可能是 Arrays.asList(...) 创建的不可变列表
  • 通过 new ArrayList<>(...) 包装后,确保后续 .add(...) 操作不会抛异常

✅ 总结对比表

特性Arrays.asList(...)new ArrayList<>()
类型固定大小可变大小
实现类java.util.Arrays.ArrayListjava.util.ArrayList
是否可增删❌ 不可✅ 可以
修改影响原数组?✅ 是的(浅拷贝)❌ 否
性能更高效(无复制)略慢(需要复制)
推荐用于只读操作增删改查操作

📌 小贴士:

如果你使用的是 Java 9+,还可以使用以下方式:

List<String> list = List.of("a", "b", "c"); // 不可变

或者:

List<String> list = new ArrayList<>(List.of("a", "b", "c")); // 可变

http://www.lqws.cn/news/497485.html

相关文章:

  • 飞算 JavaAI:重构 Java 开发范式的工程化实践
  • 可以把一套三维设计软件装在云服务器上5人同时并发使用吗
  • 通信网络编程3.0——JAVA
  • Deepoc大模型重构核工业智能基座:混合增强架构与安全增强决策技术​
  • Node.js 中的 JWT 认证:从生成到验证的完整指南
  • RPG38.角色受击
  • 配置@为src
  • React Native【实用教程】(含图标方案,常用第三库,动画,内置组件,内置Hooks,内置API,自定义组件,创建项目等)
  • Java并发编程中高效缓存设计的哲学
  • 实验九:RIPv2协议配置与分析
  • MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离
  • CRC3校验算法
  • Stable Diffusion 项目实战落地:AI绘画与文案创作的魔法 第一篇 ——让你的小说推文秒变视觉与故事双料爆款!
  • 零基础学习RabbitMQ(2)--Linux安装RabbitMQ
  • github常用插件
  • 基于SpringBoot + Vue 的网上拍卖系统
  • 使用AI开发招聘网站(100天AI编程实验)
  • C++ 第二阶段:继承与多态 - 第二节:虚函数与虚函数表
  • DataWhale-零基础络网爬虫技术(三、爬虫进阶技术)
  • 短期项目与长期目标如何同时兼顾
  • SpringCloud系列(32)--使用Hystrix进行全局服务降级
  • 基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架
  • 基于协议转换的 PROFIBUS DP 与 ETHERNET/IP 在石化生产中的协同运行实践
  • SwiftUI学习笔记day4: Lecture 4 | Stanford CS193p 2023
  • Lnmp和XunRuiCMS一键部署(Rocky linux)
  • Spring Boot 集成 Apache Kafka 实战指南
  • WebRTC(八):SDP
  • Origin绘制三Y轴柱状图、点线图、柱状点线图
  • pyhton基础【15】函数进阶一
  • C++11 static_assert(基于Boost库)从入门到精通