Java 中 ArrayList 和 CopyOnWriteArrayList 之间的区别
java programming java8object oriented programming
以下是 Java 中 ArrayList 和 CopyOnWriteArrayList 类之间的显著区别。
ArrayList | CopyOnWriteArrayList | |
---|---|---|
同步 | ArrayList 未同步。 | CopyOnWriteArrayList 已同步。 |
线程安全 | ArrayList 不是线程安全的。 | CopyOnWriteArrayList 是线程安全的。 |
迭代器类型 | ArrayList 迭代器是快速失败的,而 ArrayList如果在迭代期间发生并发修改,则抛出 ConcurrentModificationException。 | CopyOnWriteArrayList 是故障安全的,它在迭代期间永远不会抛出 ConcurrentModificationException。其背后的原因是 CopyOnWriteArrayList 每次修改时都会创建一个新的 arraylist。 |
删除操作 | ArrayList 迭代器支持在迭代过程中删除元素。 | 如果在迭代过程中尝试删除元素,CopyOnWriteArrayList.remove() 方法将引发异常。 |
性能 | ArrayList 更快。 | CopyOnWriteArrayList 比 ArrayList 慢。 |
自 Java 版本 | 1.2 | 1.5 |
示例
import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; public class Tester { public static void main(String args[]) { // 创建数组列表 CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList(); System.out.println("Initial size of al: " + al.size()); // 将元素添加到数组列表 al.add("C"); al.add("A"); al.add("E"); al.add("B"); al.add("D"); al.add("F"); al.add(1, "A2"); System.out.println("添加后 al 的大小:" + al.size()); // 显示数组列表 System.out.println("al 的内容:" + al); // 从数组列表中删除元素 al.remove("F"); al.remove(2); System.out.println("删除后 al 的大小:" + al.size()); System.out.println("al 的内容:" + al); try{ Iterator<String> iterator = al.iterator(); while(iterator.hasNext()) { iterator.remove(); } }catch(UnsupportedOperationException e) { System.out.println("不支持方法:"); } System.out.println("al 的大小:" + al.size()); } }
将产生以下结果 −
输出
al 的初始大小:0 添加后 al 的大小:7 al 的内容:[C, A2, A, E, B, D, F] 删除后 al 的大小:5 al 的内容:[C, A2, E, B, D] 不支持方法: al 的大小:5