java list.addAll介绍

java.util.List接口的 addAll()方法用于将一个集合的所有元素添加到列表中。这个方法有两个重载版本:

1. 方法签名

复制代码
// 版本1:添加到列表末尾
boolean addAll(Collection<? extends E> c)

// 版本2:插入到指定位置
boolean addAll(int index, Collection<? extends E> c)

2. 参数说明

  • c: 要添加的集合,其中的元素类型必须与列表元素类型兼容

  • index(仅版本2):插入位置的索引(从0开始)

3. 返回值

  • 如果列表因调用而改变,返回 true

  • 否则返回 false

4. 基本用法示例

示例1:添加到末尾

复制代码
List<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));
List<String> list2 = new ArrayList<>(Arrays.asList("D", "E", "F"));

// 将list2的所有元素添加到list1末尾
list1.addAll(list2);
// 结果: ["A", "B", "C", "D", "E", "F"]

示例2:插入到指定位置

复制代码
List<String> list1 = new ArrayList<>(Arrays.asList("A", "D"));
List<String> list2 = new ArrayList<>(Arrays.asList("B", "C"));

// 在索引1处插入list2的元素
list1.addAll(1, list2);
// 结果: ["A", "B", "C", "D"]

5. 实际应用场景

场景1:合并多个列表

复制代码
List<Integer> result = new ArrayList<>();
List<Integer> part1 = Arrays.asList(1, 2, 3);
List<Integer> part2 = Arrays.asList(4, 5, 6);
List<Integer> part3 = Arrays.asList(7, 8, 9);

result.addAll(part1);
result.addAll(part2);
result.addAll(part3);
// result: [1, 2, 3, 4, 5, 6, 7, 8, 9]

场景2:批量添加初始化数据

复制代码
List<String> tasks = new ArrayList<>();
tasks.add("Task 1");
tasks.addAll(Arrays.asList("Task 2", "Task 3", "Task 4"));

场景3:列表插入操作

复制代码
List<String> schedule = new ArrayList<>(Arrays.asList("Morning", "Evening"));
List<String> afternoonTasks = Arrays.asList("Lunch", "Meeting");

// 在"Morning"后面插入下午的安排
schedule.addAll(1, afternoonTasks);
// 结果: ["Morning", "Lunch", "Meeting", "Evening"]

6. 注意事项

1. 集合为null时

复制代码
List<String> list = new ArrayList<>();
list.addAll(null);  // 抛出 NullPointerException

2. 索引越界

复制代码
List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
list.addAll(5, Arrays.asList("C", "D"));  // 抛出 IndexOutOfBoundsException

3. 修改被添加的集合

复制代码
List<String> source = new ArrayList<>(Arrays.asList("A", "B", "C"));
List<String> target = new ArrayList<>();

target.addAll(source);
source.add("D");  // 不影响target
System.out.println(target);  // 输出: [A, B, C]

4. 添加自身

复制代码
List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
list.addAll(list);  // 会导致无限循环,抛出 StackOverflowError

7. 与单个add()比较

特性 addAll() 循环使用 add()
代码简洁性
性能 通常更优 次优
可读性
复制代码
// 使用 addAll() - 推荐
list1.addAll(list2);

// 使用循环 add() - 不推荐
for (String item : list2) {
    list1.add(item);
}

8. 与Java 8+ Stream结合

复制代码
// 使用Stream合并多个列表
List<Integer> merged = Stream.of(list1, list2, list3)
    .flatMap(List::stream)
    .collect(Collectors.toList());

总结

addAll()是Java集合框架中一个非常实用的方法,它:

  • 提供批量添加元素的功能

  • 支持在指定位置插入集合

  • 比循环添加更简洁高效

  • 广泛应用于列表合并、批量初始化等场景

使用时需要注意处理null值和索引边界情况,避免常见的运行时异常。

相关推荐
ekkcole3 分钟前
java实现对excel文件合并单元格(只针对文件)
java·开发语言·excel
no24544104 分钟前
RAGFlow 全面接入 MinerU 2.0,支持 pipeline、vlm-transformers、vlm-sglang 三种模式,解析精度大幅度up
java·大数据·人工智能·python·ai·sglang
lkbhua莱克瓦246 分钟前
MySQL事务隔离级别:从并发混乱到数据一致性守护者
java·数据库·mysql·隔离级别
Mr -老鬼15 分钟前
Java、Go、Rust高并发时代“称雄”之战:场景适配与生态博弈
java·golang·rust
vivo互联网技术17 分钟前
vivo 微服务架构实践之 Dubbo 性能优化
java·后端·微服务·中间件·dubbo
仙俊红18 分钟前
Spring 构造器注入 vs 字段注入
java·后端·spring
iAkuya19 分钟前
(leetcode)力扣100 40二叉树的直径(迭代递归)
java·算法·leetcode
0和1的舞者22 分钟前
Spring 事务核心知识点全梳理(编程式 + 声明式 + 注解详解)
java·后端·spring
修炼室23 分钟前
在 Windows 上构建不占 C 盘的科研级 WSL 实验环境(Ubuntu 22.04)
c语言·windows·ubuntu