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")); // 可变

相关推荐
zl_dfq5 分钟前
数据结构之 【树的简介】(树的(相关)概念、二叉树的概念、部分性质、满二叉树、完全二叉树)
数据结构
会的全对٩(ˊᗜˋ*)و2 小时前
【数据结构】栈
数据结构·经验分享·
冰糖猕猴桃2 小时前
【Python】进阶 - 数据结构与算法
开发语言·数据结构·python·算法·时间复杂度、空间复杂度·树、二叉树·堆、图
lifallen3 小时前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
2401_881244404 小时前
Treap树
数据结构·算法
乌萨奇也要立志学C++4 小时前
二叉树OJ题(单值树、相同树、找子树、构建和遍历)
数据结构·算法
hn小菜鸡12 小时前
LeetCode 377.组合总和IV
数据结构·算法·leetcode
亮亮爱刷题10 天前
飞往大厂梦之算法提升-7
数据结构·算法·leetcode·动态规划
_周游10 天前
【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
数据结构·算法
双叶83610 天前
(C语言)Map数组的实现(数据结构)(链表)(指针)
c语言·数据结构·c++·算法·链表·哈希算法