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

相关推荐
paeamecium6 分钟前
【PAT甲级真题】- Student List for Course (25)
数据结构·c++·算法·list·pat考试
Book思议-14 分钟前
【数据结构】栈与队列全方位对比 + C 语言完整实现
c语言·数据结构·算法··队列
是苏浙2 小时前
初识集合框架
java·数据结构
如何原谅奋力过但无声2 小时前
【chap11-动态规划(上 - 基础题目&背包问题)】用Python3刷《代码随想录》
数据结构·python·算法·动态规划
小王C语言4 小时前
【基础IO】————简单设计一下libc库
前端·数据结构·算法
_日拱一卒4 小时前
LeetCode:滑动窗口的最大值
数据结构·算法·leetcode
老约家的可汗4 小时前
list 容器详解:基本介绍与常见使用
c语言·数据结构·c++·list
Book思议-4 小时前
【数据结构】字符串模式匹配:暴力算法与 KMP 算法实现与解析
数据结构·算法·kmp算法·bf算法
mifengxing5 小时前
力扣HOT100——(1)两数之和
java·数据结构·算法·leetcode·hot100
罗湖老棍子5 小时前
【 例 1】区间和(信息学奥赛一本通- P1547)(基础线段树和单点修改区间查询树状数组模版)
数据结构·算法·线段树·树状数组·单点修改 区间查询