在 Java 中,Arrays.asList(...)
和 new ArrayList<>(...)
都可以用来创建列表(List
),但它们之间存在显著的区别。下面是对两者的主要区别进行的对比分析:
✅ 1. 可变性不同
特性 | Arrays.asList(...) | new ArrayList<>(...) |
---|
是否可变 | ❌ 不可变(大小不可变) | ✅ 可变 |
是否支持添加/删除元素 | ❌ 抛出 UnsupportedOperationException | ✅ 支持 |
示例:
List<String> list1 = Arrays.asList("a", "b", "c");
list1.add("d"); 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 |
内部结构 | 直接引用传入的数组 | 内部新建数组并复制数据 |
示例:
String[] arr = {"a", "b"};
List<String> list1 = Arrays.asList(arr);
arr[0] = "c";
System.out.println(list1); List<String> list2 = new ArrayList<>(Arrays.asList("a", "b"));
arr[0] = "x";
System.out.println(list2);
✅ 3. null 元素处理
情况 | Arrays.asList(...) | new ArrayList<>() |
---|
支持 null 吗? | ✅ 支持 | ✅ 支持 |
null 数组传入 | ❌ 抛出 NullPointerException | ❌ 抛出 NullPointerException |
示例:
List<String> list1 = Arrays.asList(null, "a");
List<String> list2 = new ArrayList<>(Arrays.asList(null, "a")); List<String> list3 = Arrays.asList((String[]) null);
✅ 4. 性能与用途场景
场景 | 推荐方式 |
---|
仅做读取操作、性能敏感 | Arrays.asList(...) (轻量级封装) |
需要频繁增删改 | new ArrayList<>() |
转换为真正的可变 List | new ArrayList<>(Arrays.asList(...)) |
✅ 5. 使用建议总结
使用目的 | 推荐写法 |
---|
快速构建只读列表 | Arrays.asList(...) |
构建可变列表 | new ArrayList<>(...) |
将数组转为可变列表 | new ArrayList<>(Arrays.asList(...)) |
多线程或频繁修改 | new ArrayList<>(...) 或其他并发容器 |
✅ 在你的代码中的使用
你当前的代码中:
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+,还可以使用以下方式:
List<String> list = List.of("a", "b", "c");
或者:
List<String> list = new ArrayList<>(List.of("a", "b", "c"));