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