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

相关推荐
朝朝又沐沐4 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
艾莉丝努力练剑5 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
科大饭桶6 小时前
数据结构自学Day13 -- 快速排序--“前后指针法”
数据结构·算法·leetcode·排序算法·c
打码农的篮球6 小时前
STL——list
开发语言·c++·list
设计师小聂!8 小时前
力扣热题100----------53最大子数组和
java·数据结构·算法·leetcode
YouQian7728 小时前
问题 C: 字符串匹配
c语言·数据结构·算法
yanxing.D8 小时前
408——数据结构(第二章 线性表)
数据结构·算法
艾莉丝努力练剑9 小时前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
waveee12310 小时前
学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型
服务器·数据结构·学习
花开富贵ii11 小时前
代码随想录算法训练营二十八天|动态规划part01
java·数据结构·算法·leetcode·动态规划