1. 概述
ArrayList
是 Java 中常用的 List
实现类。实际开发中,我们常需要将多个字符串数组中的元素合并到一个 ArrayList
中。
本文将探讨几种高效实现该需求的方法,并分析各自特点。
2. 问题场景
先通过示例理解需求。假设有三个字符串数组:
final static String[] ARRAY1 = { "Java", "Kotlin", "Sql", "Javascript" };
final static String[] ARRAY2 = { "C", "C++", "C#", "Typescript" };
final static String[] ARRAY3 = { "Python", "Ruby", "Go", "Rust" };
以及一个初始化方法,生成包含两个元素的 List
:
List<String> initLanguageList() {
List<String> languageList = new ArrayList<>();
languageList.add("Languages");
languageList.add(":");
return languageList;
}
若将三个数组的元素依次添加到 initLanguageList()
返回的 List
中,期望得到如下结果:
final static List<String> EXPECTED = List.of(
"Languages", ":",
"Java", "Kotlin", "Sql", "Javascript",
"C", "C++", "C#", "Typescript",
"Python", "Ruby", "Go", "Rust");
虽然 List
的 add()
和 addAll()
方法能方便添加单个字符串或字符串集合,但这两个方法无法直接添加整个字符串数组。下面介绍几种解决方案。
3. 转换数组为List后使用addAll
List.addAll()
能添加多个元素,但要求参数为 Collection
类型。因此可先将数组转换为 List
再调用 addAll()
。使用 Arrays.asList()
方法转换数组:
List<String> languageList = initLanguageList();
for (String[] array : List.of(ARRAY1, ARRAY2, ARRAY3)) {
languageList.addAll(Arrays.asList(array));
}
assertEquals(EXPECTED, languageList);
实现步骤:
- 将三个数组包装成
List
- 循环遍历每个数组
- 通过
Arrays.asList()
转换数组为List
- 调用
addAll()
添加元素
⚠️ 注意:此方法会创建临时 List
对象,可能影响性能。
4. 使用Collections.addAll()
Collections.addAll()
方法支持可变参数(Varargs),而 Java 会将可变参数视为数组,因此可直接传入数组作为参数:
List<String> languageList = initLanguageList();
for (String[] array : List.of(ARRAY1, ARRAY2, ARRAY3)) {
Collections.addAll(languageList, array);
}
assertEquals(EXPECTED, languageList);
优势:
✅ 无需创建临时 List
对象
✅ 代码更简洁
✅ 性能优于方案3
5. 使用Stream的flatMap
利用 Java Stream API 可优雅处理集合操作。核心是使用 flatMap()
将多维数据扁平化:
List<String> languageList = initLanguageList();
Stream.of(ARRAY1, ARRAY2, ARRAY3)
.flatMap(Arrays::stream)
.forEachOrdered(languageList::add);
assertEquals(EXPECTED, languageList);
关键点:
Stream.of()
创建包含三个数组的流flatMap(Arrays::stream)
将流中的数组转换为元素流forEachOrdered()
按顺序添加元素到目标列表
优势: ✅ 函数式编程风格 ✅ 代码可读性高 ✅ 便于后续链式操作
6. 总结
本文对比了三种将字符串数组添加到 ArrayList
的方法:
方法 | 优点 | 缺点 |
---|---|---|
Arrays.asList()+addAll | 思路直观 | 创建临时对象 |
Collections.addAll() | 性能最优,代码简洁 | 无 |
Stream.flatMap() | 函数式风格,扩展性强 | 稍有性能开销 |
推荐选择:
- 简单场景:
Collections.addAll()
(性能最佳) - 复杂处理:
Stream.flatMap()
(便于链式操作) - 避免使用:
Arrays.asList()+addAll()
(存在性能损耗)
完整示例代码可在 GitHub 查阅。