当前位置: 首页 > 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")); // 可变

相关文章:

  • 火山引擎大模型未来发展趋势
  • C++ Vector 基础入门操作
  • 经济学神图:洛伦兹曲线
  • Auto-GPT vs ReAct:两种智能体思路对决
  • Nginx与Tomcat:谁更适合你的服务器?
  • Redis Stream 消息队列详解及 PHP 实现
  • Redis主从、哨兵、 Cluster集群区别
  • [k8s]-疑问:pod重新分配到同样的node上,pullpolicy是always,会存储两份相同的镜像吗?
  • Linux 系统管理核心命令详解:系统监控 + 用户管理全攻略
  • linux系统SVN快速上手指南
  • leetcode543-二叉树的直径
  • 融合LSTM与自注意力机制的多步光伏功率预测新模型解析
  • leetcode:98. 验证二叉搜索树
  • Vue按键事件
  • Mysql常见的SQL语句格式
  • 华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫
  • Modbus TCP转Profibus DP网关与JF - 600MT称重变送器在STEP 7快速配置
  • 网络安全之某cms的漏洞分析
  • Pytorch Lightning 进阶 1 - 梯度检查点(Gradient Checkpointing)
  • MySQL8:jdbc插入数据后获取自增ID
  • 抽奖小程序制作/网站排名优化需要多久
  • 软件测试培训机构排行/seo排名优化教程
  • 小说主角重生之后做网站/广州新一期lpr
  • 日照公司做网站/软文大全500篇
  • 宁波高新区建设局网站/东莞网站推广运营公司
  • 做网站需提供什么资料/网站制作的流程是什么