Java编程中ArrayList和CopyOnWriteArrayList之间的区别。

ArrayList和CopyOnWriteArrayList都是Java中List接口的实现。但是也存在某些差异。

以下是ArrayList和CopyOnWriteArrayList之间的重要区别。

序号数组列表CopyOnWriteArrayList
1同步化ArrayList本质上不是同步的。另一方面,CopyOnWriteArrayList本质上是同步的,即,一次只有一个线程可以访问该对象。
2性能ArrayList速度很快,因为其操作中没有同步。同步使CopyOnWriteArrayList性能降低。
3故障安全ArrayList迭代器快速失败,并且在遍历期间进行修改时引发ConcurrentModificationException。CopyOnWriteArrayList是故障安全的,并允许在遍历期间进行修改。
4删除元素ArrayList的迭代器可以在迭代时执行remove操作。CopyOnWriteArrayList不能在迭代时执行删除操作,否则它将引发运行时异常UnsupportedOperationException。
5Java简介ArrayList比CopyOnWriteArrayList早,因为它是在Java 1.2版中添加的。在Java 1.5版(或Java 5版)中添加了CopyOnWriteArrayList类。
6ArrayList类存在于java.util包中。CopyOnWriteArrayList类存在于java.util.concurrent包中。

ArrayList与CopyOnWriteArrayList的示例

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