最常用且推荐的方式是使用 addAll() 方法,它高效简洁、无需额外依赖;也可用 Stream.concat()(Java 8+)实现函数式合并,或借助 Apache Commons Collections 的 ListUtils.union()(会去重)。

Java 中 ArrayList 合并多个列表,最常用且推荐的方式是使用 addAll() 方法,它高效、简洁、无需额外依赖。
用 addAll() 逐个合并(最常用)
这是最直观、性能好、适合大多数场景的做法。只需选定一个目标列表,调用 addAll() 把其他列表元素追加进去:
- 目标列表必须是可变的(如 new ArrayList()),不能是
Collections.unmodifiableList()或 Arrays.asList() 返回的固定大小列表 - 原列表内容不会被修改,只向目标列表添加副本引用(注意:若存的是对象,实际是引用复制,非深拷贝)
- 示例:
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"));
ArrayList<string> merged = new ArrayList(list1); // 先复制 list1
merged.addAll(list2);
merged.addAll(list3);
// 结果:["a", "b", "c", "d", "e"]</string></string></string></string>
用 Stream.concat() 合并(Java 8+,函数式风格)
适合链式操作或需去重、过滤等后续处理的场景,但会创建新列表,略多一次遍历开销:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 需要将每个 ArrayList 转为 Stream,再用
Stream.concat()两两拼接,或用Stream.of().flatMap()批量处理 - 最终用
Collectors.toList()收集为新 ArrayList - 示例(合并三个列表):
ArrayList<string> merged = Stream.of(list1, list2, list3)
.flatMap(List::stream)
.collect(Collectors.toCollection(ArrayList::new));</string>
用 Apache Commons Collections(第三方库)
如果项目已引入 commons-collections4,可用 CollectionUtils.union() 或 ListUtils.union(),但注意:
-
ListUtils.union()会自动去重(按 equals 判断),不是简单拼接 - 如需严格保持顺序和重复元素,仍推荐
addAll() - 引入方式(Maven):
<dependency><groupid>org.apache.commons</groupid><artifactid>commons-collections4</artifactid><version>4.4</version></dependency>
注意事项与避坑点
合并时容易忽略的关键细节:
-
空指针安全:确保传入的列表非 null,建议提前判空或用
Objects.requireNonNull() -
类型一致:所有列表泛型类型需兼容(如都是
ArrayList),否则编译不通过 -
容量预估:若合并大量数据,可预先用
new ArrayList(totalSize)指定初始容量,避免多次扩容 -
线程安全:ArrayList 本身不保证线程安全,多线程合并需外部同步(如用
Collections.synchronizedList()包装或改用 CopyOnWriteArrayList)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










