以下是Java中ArrayList和CopyOnWriteArrayList类之间的显着区别。
| 数组列表 | 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("Size of al after additions: " + al.size());
//显示数组列表
System.out.println("Contents of al: " + al);
//从数组列表中删除元素
al.remove("F");
al.remove(2);
System.out.println("Size of al after deletions: " + al.size());
System.out.println("Contents of al: " + al);
try{
Iterator<String> iterator = al.iterator();
while(iterator.hasNext()) {
iterator.remove();
}
}catch(UnsupportedOperationException e) {
System.out.println("不支持的方法:");
}
System.out.println("Size of al: " + al.size());
}
}这将产生以下结果-
输出结果
Initial size of al: 0 Size of al after additions: 7 Contents of al: [C, A2, A, E, B, D, F] Size of al after deletions: 5 Contents of al: [C, A2, E, B, D] 不支持的方法: Size of al: 5