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 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
不知名XL10 小时前
day50 单调栈
数据结构·算法·leetcode
cpp_250112 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_250112 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
季明洵13 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
only-qi13 小时前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表
cpp_250113 小时前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-13 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒13 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
数智工坊14 小时前
【数据结构-树与二叉树】4.6 树与森林的存储-转化-遍历
数据结构