📜  ArrayList 和 CopyOnWriteArrayList 的区别

📅  最后修改于: 2022-05-13 01:55:28.675000             🧑  作者: Mango

ArrayList 和 CopyOnWriteArrayList 的区别

ArrayList 和 CopyOnWriteArray 都实现了 List 接口。但是 ArrayList 和 CopyOnWriteArrayList 有很多不同之处:

  • CopyOnWriteArrayList 创建底层 ArrayList 的克隆副本,对于特定点的每个更新操作,两者都将自动同步,这由 JVM 负责。因此,对执行读取操作的线程没有影响。因此 ArrayList 中不存在线程安全性,而 CopyOnWriteArrayList 是线程安全的。
  • 在一个线程迭代 ArrayList 对象时,如果其他线程尝试进行修改,那么我们将得到运行时异常 ConcurrentModificationException。在 CopyOnWriteArrayList 的情况下,我们不会得到任何异常。
  • ArrayList 是在 JDK 1.2 中引入的,而 CopyOnWriteArrayList 是 SUN 人在 JDK 1.5 中引入的。
  • ArrayList 的迭代器可以在迭代的同时进行移除操作。但是CopyOnWriteArrayList的Iterator在迭代的时候不能进行remove操作,否则会抛出运行时异常UnsupportedOperationException。

    下面是这点的实现。

// Java program to illustrate ArrayList
import java.util.*;
  
class CopyDemo
{
    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"))
            {
                // Can remove
                itr.remove();
            }
        }
        System.out.println(l);
    }
}

输出:

[A,C]
// Java program to illustrate CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.*;
  
class CopyDemo 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"))
            {
                // Throws RuntimeException
                itr.remove();
            }
            Thread.sleep(1000);
        }
        System.out.println(l);
    }
}

输出:

A
B
Exception in thread "main" java.lang.UnsupportedOperationException