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");

虽然 Listadd()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);

实现步骤:

  1. 将三个数组包装成 List
  2. 循环遍历每个数组
  3. 通过 Arrays.asList() 转换数组为 List
  4. 调用 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);

关键点:

  1. Stream.of() 创建包含三个数组的流
  2. flatMap(Arrays::stream) 将流中的数组转换为元素流
  3. forEachOrdered() 按顺序添加元素到目标列表

优势: ✅ 函数式编程风格 ✅ 代码可读性高 ✅ 便于后续链式操作

6. 总结

本文对比了三种将字符串数组添加到 ArrayList 的方法:

方法 优点 缺点
Arrays.asList()+addAll 思路直观 创建临时对象
Collections.addAll() 性能最优,代码简洁
Stream.flatMap() 函数式风格,扩展性强 稍有性能开销

推荐选择

  • 简单场景:Collections.addAll()(性能最佳)
  • 复杂处理:Stream.flatMap()(便于链式操作)
  • 避免使用:Arrays.asList()+addAll()(存在性能损耗)

完整示例代码可在 GitHub 查阅。


原始标题:How to Add String Arrays to ArrayList in Java | Baeldung