ArrayList和CopyOnWriteArrayList都是Java中List接口的实现。但是也存在某些差异。
以下是ArrayList和CopyOnWriteArrayList之间的重要区别。
序号 | 键 | 数组列表 | CopyOnWriteArrayList |
---|---|---|---|
1 | 同步化 | ArrayList本质上不是同步的。 | 另一方面,CopyOnWriteArrayList本质上是同步的,即,一次只有一个线程可以访问该对象。 |
2 | 性能 | ArrayList速度很快,因为其操作中没有同步。 | 同步使CopyOnWriteArrayList性能降低。 |
3 | 故障安全 | ArrayList迭代器快速失败,并且在遍历期间进行修改时引发ConcurrentModificationException。 | CopyOnWriteArrayList是故障安全的,并允许在遍历期间进行修改。 |
4 | 删除元素 | ArrayList的迭代器可以在迭代时执行remove操作。 | CopyOnWriteArrayList不能在迭代时执行删除操作,否则它将引发运行时异常UnsupportedOperationException。 |
5 | Java简介 | ArrayList比CopyOnWriteArrayList早,因为它是在Java 1.2版中添加的。 | 在Java 1.5版(或Java 5版)中添加了CopyOnWriteArrayList类。 |
6 | 包 | ArrayList类存在于java.util包中。 | CopyOnWriteArrayList类存在于java.util.concurrent包中。 |
ArrayListDemo.java
import java.util.*; public class ArrayListDemo{ public static void main(String[] args){ ArrayList l = new ArrayList(); l.add("A"); l.add("B"); l.add("C"); Iterator itr = l.iterator(); while (itr.hasNext()){ String s = (String)itr.next(); if (s.equals("B")){ itr.remove(); } } System.out.println(l); } }
输出结果
[A,C]
CopyOnWriteArrayListDemo.java
import java.util.concurrent.CopyOnWriteArrayList; import java.util.*; class CopyOnWriteArrayListDemo extends Thread { static CopyOnWriteArrayList l = new CopyOnWriteArrayList(); public static void main(String[] args) throws InterruptedException{ l.add("A"); l.add("B"); l.add("C"); Iterator itr = l.iterator(); while (itr.hasNext()){ String s = (String)itr.next(); System.out.println(s); if (s.equals("B")){ //引发RuntimeException- itr.remove(); } Thread.sleep(1000); } System.out.println(l); } }
输出结果
A B Exception in thread "main" java.lang.UnsupportedOperationException