📅  最后修改于: 2023-12-03 15:31:51.686000             🧑  作者: Mango
CopyOnWriteArrayList
是 Java 集合框架中的一个线程安全的 List 实现。它像 ArrayList
一样实现了 List
接口,但是其内部使用了一种叫做 “Copy-On-Write”(写时复制) 的技术,可以提供更好的线程安全保障。
在 CopyOnWriteArrayList
中,每次对集合的修改操作(比如增加、修改、删除等)都会先进行一份拷贝,并在拷贝上执行修改操作。这意味着,当多个线程同时对 CopyOnWriteArrayList
进行操作时,它们不会相互影响,也不会触发 ConcurrentModificationException。当一个线程对集合进行修改时,它不会影响到其他线程正在读取集合中的元素。
但是需要注意的是,Copy-On-Write 技术最适合于读操作比较频繁而写操作比较少的场景,因为每次写操作都会触发一次整个集合的拷贝,而且也会带来一定的性能损耗。
CopyOnWriteArrayList
除了提供常规的增、删、改、查等方法外,还支持 removeIf()
方法。该方法可以根据给定的过滤条件,删除集合中所有符合条件的元素。在删除元素时,也是先拷贝一份集合再进行操作,可以保证线程安全。
removeIf()
方法的定义如下:
boolean removeIf(Predicate<? super E> filter)
其中,Predicate
是 Java 8 引入的函数式接口,可以表示一个条件判断函数。removeIf()
方法会对集合中的每个元素都进行一次 filter
函数的调用,如果 filter
函数返回 true
,则表示该元素符合删除条件,即被删除。
下面是一个示例代码,演示了如何使用 removeIf()
方法删除 CopyOnWriteArrayList
中的元素:
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListDemo {
public static void main(String[] args) {
// 创建一个 CopyOnWriteArrayList
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用 removeIf() 方法删除列表中的奇数元素
list.removeIf(n -> n % 2 != 0);
// 打印删除后的列表
System.out.println(list);
}
}
上述代码会输出一个删除了奇数元素后的 CopyOnWriteArrayList
:
[2, 4]
这里使用了 Lambda 表达式语法,将判断奇偶性的逻辑封装在一个函数式接口中,作为 removeIf()
方法的参数。经过过滤后,只剩下了偶数元素。
CopyOnWriteArrayList
是 Java 集合框架中一种非常适合读多写少场景下的线程安全 List 实现,有着优秀的性能和可靠的线程安全保障。removeIf()
方法是其中的一个便捷的操作方法,可以根据过滤条件批量删除集合中符合条件的元素。如果你需要处理读多写少的场景,可以考虑使用 CopyOnWriteArrayList
和 removeIf()
方法来简化你的代码实现。