arraylist合并多个列表首选addall()(修改原列表、高效),其次stream.concat()或flatmap(生成新列表、函数式风格),也可用apache commons的listutils.union()(去重并集);需注意空值、泛型、性能及线程安全。

Java 中 ArrayList 合并多个列表,核心是把其他列表的元素添加到目标列表中,常用方法有 addAll()、Stream.concat()(Java 8+)、或借助第三方库如 Apache Commons Collections。关键看是否需要修改原列表、是否要保持不可变性、以及性能要求。
用 addAll() 直接合并(修改原列表)
这是最常用、最高效的方式,适用于允许修改目标 ArrayList 的场景。
- 调用目标列表的
addAll(Collection)方法,传入另一个 ArrayList 或任意 Collection - 支持链式调用:可连续合并多个列表
- 注意:会改变原列表内容,且不自动去重、不排序
示例:
ArrayList<string> list1 = new ArrayList(Arrays.asList("a", "b"));
ArrayList<string> list2 = new ArrayList(Arrays.asList("c", "d"));
ArrayList<string> list3 = new ArrayList(Arrays.asList("e"));
list1.addAll(list2); // list1 变为 [a, b, c, d]
list1.addAll(list3); // list1 变为 [a, b, c, d, e]
</string></string></string>
用 Stream 合并(生成新列表,不改原数据)
适合函数式风格、需保留原始列表不变,或需链式处理(如去重、过滤、映射)的场景。
- 用
Stream.concat()两两合并,再用Collectors.toList()收集 - 多个列表时可用
Stream.of(list1, list2, list3).flatMap(Collection::stream) - 返回的是新 ArrayList,原列表完全不受影响
示例(合并三个列表):
ArrayList<string> list1 = new ArrayList(Arrays.asList("a"));
ArrayList<string> list2 = new ArrayList(Arrays.asList("b", "c"));
ArrayList<string> list3 = new ArrayList(Arrays.asList("d"));
List<string> merged = Stream.of(list1, list2, list3)
.flatMap(Collection::stream)
.collect(Collectors.toList());
// merged = [a, b, c, d];list1/list2/list3 未被修改
</string></string></string></string>
用 CollectionsUtils(Apache Commons)简化操作
如果项目已引入 org.apache.commons:commons-collections4,可直接用工具类减少样板代码。
-
CollectionUtils.union()返回并集(去重),但返回的是 Collection,需转 ArrayList -
CollectionUtils.collate()可合并并排序(需元素实现 Comparable) - 更推荐
ListUtils.union()(v4.4+),返回 List 且保持顺序
示例:
// 需添加依赖:org.apache.commons:commons-collections4 List<string> result = ListUtils.union(list1, list2, list3); // 注意:union 是去重并集;如需简单拼接,仍建议用 addAll 或 Stream </string>
注意事项与选择建议
实际使用时注意几个细节:
- 合并空列表安全:addAll(null) 会抛 NPE,务必判空;Stream 方式对 null 列表也需预处理
- 泛型一致性:所有列表元素类型需兼容,否则编译报错
- 性能差异:addAll() 是 O(n) 时间、原地扩容;Stream 创建中间对象,小数据量无感,大数据量略慢
- 线程安全:ArrayList 本身非线程安全,多线程合并需额外同步
日常开发中,修改原列表优先选 addAll();强调不可变性或需后续流式处理,选 Stream;已有 Commons 库且需高级集合运算,再考虑 ListUtils。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











