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

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


✅ 1. 可变性不同

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

示例:

java 复制代码
List<String> list1 = Arrays.asList("a", "b", "c");
list1.add("d"); // 报错:java.lang.UnsupportedOperationException

List<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.ArrayList java.util.ArrayList
内部结构 直接引用传入的数组 内部新建数组并复制数据

示例:

java 复制代码
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

示例:

java 复制代码
List<String> list1 = Arrays.asList(null, "a"); // OK
List<String> list2 = new ArrayList<>(Arrays.asList(null, "a")); // OK

List<String> list3 = Arrays.asList((String[]) null); // NullPointerException

✅ 4. 性能与用途场景

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

✅ 5. 使用建议总结

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

✅ 在你的代码中的使用

你当前的代码中:

java 复制代码
cBean.setQueueCodeList(new ArrayList<>(cBean.getQueueCodeList()));

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

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

✅ 总结对比表

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

📌 小贴士:

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

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

或者:

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

相关推荐
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾4 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres8214 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q4 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒4 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
世人万千丶4 天前
成语接龙小应用 - HarmonyOS ArkUI 开发实战-TextInput与List列表-PC版本
华为·list·harmonyos·鸿蒙·鸿蒙系统
WL学习笔记4 天前
单项不带头不循环链表
数据结构·链表
小糯米6014 天前
JS 数组
数据结构·算法·排序算法
未若君雅裁4 天前
Python 数据容器详解,list、tuple、str、set、dict 到底怎么选
windows·python·list