ArrayList无原子批量增删方法,但addAll()可高效批量添加,removeIf()、removeAll()等可按需批量删除,预估容量和外部同步可提升性能与线程安全。

Java 中 ArrayList 本身不提供原子性的“批量添加/删除”方法,但可以通过标准 API 组合高效完成,关键在于避免逐个调用 add() 或 remove() 导致的多次扩容或元素移动开销。
批量添加:用 addAll() 最直接
addAll() 是最常用、最高效的批量添加方式,它会一次性将另一个集合(如 List、Set)的所有元素追加到当前 ArrayList 末尾:
- 如果目标
ArrayList容量不足,addAll()会触发一次扩容(而非每加一个元素都判断),减少数组复制次数 - 支持指定插入位置的重载:
list.addAll(index, collection),从指定索引开始插入,后续元素自动后移 - 传入的
collection可以是任意Collection实现,包括另一个ArrayList、Arrays.asList()返回的列表等
示例:
Listlist.addAll(Arrays.asList("a", "b", "c")); // 一次性加3个
批量删除:分场景选择合适方式
没有通用的“批量删除多个不同值”的单方法,但根据需求有几种高效做法:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
删掉所有匹配某条件的元素:用
removeIf()(Java 8+),内部遍历一次,边查边删,比手动循环remove()更安全(避免ConcurrentModificationException或漏删) -
删掉一批已知索引的元素:先将索引倒序排序,再逐个调用
remove(int index),防止因前面删除导致后续索引偏移 -
删掉另一集合中包含的所有元素:用
removeAll(Collection> c),它会保留当前列表中不在c中的元素(即取差集)
示例:
list.removeIf(s -> s.startsWith("a")); // 删所有以"a"开头的list.removeAll(Arrays.asList("x", "y", "z")); // 删掉这3个值(如果存在)
性能优化小技巧
批量操作前预估容量,能显著减少扩容次数:
- 创建时指定初始容量:
new ArrayList(expectedSize) - 已有列表要批量添加大量元素,可先调用
ensureCapacity()预留空间 - 避免在循环里反复调用
size()或get(i)做条件判断——批量操作应尽量用集合运算替代逐个判断
注意线程安全性
ArrayList 不是线程安全的。如果多个线程同时进行批量添加或删除,必须外部同步:
- 用
Collections.synchronizedList(new ArrayList())包装(但注意:addAll等复合操作仍需手动同步) - 或改用
CopyOnWriteArrayList(适合读多写少、批量写入不频繁的场景) - 更推荐在业务层使用显式锁(如
synchronized块)保护整个批量操作过程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










