1. ArrayList 概述
本文将介绍如何向一个已初始化的 ArrayList
中批量添加多个元素。
关于 ArrayList
的基础使用,可参考 Java ArrayList 详解。本文聚焦于“批量添加”这一高频操作,总结几种实用且高效的写法,帮你少踩坑、写得更优雅。
2. 使用 addAll 方法
最直接的方式是调用 List
接口提供的 addAll(Collection<? extends E> c)
方法,传入一个集合即可完成批量添加。
✅ 示例代码:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> anotherList = Arrays.asList(5, 12, 9, 3, 15, 88);
list.addAll(anotherList);
⚠️ 注意事项:
addAll
添加的是对象引用,不是深拷贝。如果anotherList
中的元素是可变对象,后续修改会影响原列表和目标列表。- 添加顺序按传入集合的迭代顺序进行。
3. 使用 Collections.addAll
Collections
工具类提供了静态方法 addAll
,支持将可变参数或数组直接添加到目标 List 中,无需先包装成集合。
这在初始化或临时添加几个元素时特别方便,写法更简洁。
✅ 示例 1:添加可变参数(适合少量元素)
List<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5);
✅ 示例 2:添加数组
List<Integer> list = new ArrayList<>();
Integer[] otherList = new Integer[]{1, 2, 3, 4, 5};
Collections.addAll(list, otherList);
⚠️ 同样地,这里也是引用传递,不会创建新对象。
💡 优势:
- 不需要显式创建中间
List
,减少对象创建开销。 - 适用于数组转 List 的场景,简单粗暴。
4. 使用 Java 8 Stream API
Java 8 的 Stream
提供了更灵活的批量处理能力。虽然性能上不一定最优,但在需要过滤、跳过、映射等逻辑时非常有用。
基本用法
List<Integer> source = Arrays.asList(10, 20, 30);
List<Integer> target = new ArrayList<>(Arrays.asList(1, 2));
source.stream()
.forEachOrdered(target::add);
📌 forEachOrdered
保证元素按原始顺序添加,避免并行流导致顺序错乱。
进阶操作:跳过与过滤
想跳过前 N 个元素?加个 skip
就行:
source.stream()
.skip(1) // 跳过第一个
.forEachOrdered(target::add);
只添加大于 10 的值?用 filter
:
source.stream()
.filter(i -> i > 10)
.forEachOrdered(target::add);
null 安全处理
当 source 可能为 null 时,推荐使用 Optional
避免 NPE:
Optional.ofNullable(source)
.ifPresent(target::addAll);
✅ 这种写法既安全又函数式,是现代 Java 编程中的推荐做法。
💡 注意:
target::addAll
比target::add
更高效,因为addAll
内部会做批量扩容优化。- 若
source
很大,stream + forEach
可能略慢于直接addAll
,但差距通常可忽略。
5. 总结
方法 | 适用场景 | 是否支持过滤 | 推荐指数 |
---|---|---|---|
list.addAll(collection) |
通用批量添加 | ❌ | ✅✅✅✅ |
Collections.addAll(list, elements...) |
添加数组或可变参数 | ❌ | ✅✅✅✅✅ |
stream().forEach(add) |
需要跳过、过滤、映射等逻辑 | ✅ | ✅✅✅✅ |
Optional + addAll |
源集合可能为 null | ✅(条件判断) | ✅✅✅✅✅ |
📌 最佳实践建议:
- 日常批量添加优先使用
addAll
或Collections.addAll
。 - 需要条件判断或流式处理时,用
Stream
更清晰。 - 所有对外部传入集合的操作,务必考虑 null 安全,
Optional
是你的朋友。
所有示例代码已托管至 GitHub:https://github.com/john-doe/tutorials/tree/master/core-java-modules/core-java-collections-array-list