Java 中 ArrayList 和 CopyOnWriteArrayList 之间的区别

java programming java8object oriented programming

以下是 Java 中 ArrayList 和 CopyOnWriteArrayList 类之间的显著区别。

 ArrayListCopyOnWriteArrayList
同步ArrayList 未同步。CopyOnWriteArrayList 已同步。
线程安全ArrayList 不是线程安全的。CopyOnWriteArrayList 是线程安全的。
迭代器类型ArrayList 迭代器是快速失败的,而 ArrayList如果在迭代期间发生并发修改,则抛出 ConcurrentModificationException。CopyOnWriteArrayList 是故障安全的,它在迭代期间永远不会抛出 ConcurrentModificationException。其背后的原因是 CopyOnWriteArrayList 每次修改时都会创建一个新的 arraylist。
删除操作ArrayList 迭代器支持在迭代过程中删除元素。如果在迭代过程中尝试删除元素,CopyOnWriteArrayList.remove() 方法将引发异常。
性能ArrayList 更快。CopyOnWriteArrayList 比 ArrayList 慢。
自 Java 版本1.21.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("添加后 al 的大小:" + al.size());

      // 显示数组列表
      System.out.println("al 的内容:" + al);

      // 从数组列表中删除元素
      al.remove("F");
      al.remove(2);
      System.out.println("删除后 al 的大小:" + al.size());
      System.out.println("al 的内容:" + al);

      try{
         Iterator<String> iterator = al.iterator();
         while(iterator.hasNext()) {
            iterator.remove();
         }
      }catch(UnsupportedOperationException e) {
         System.out.println("不支持方法:");
      }
      System.out.println("al 的大小:" + al.size());
   }
}

将产生以下结果 −

输出

al 的初始大小:0
添加后 al 的大小:7
al 的内容:[C, A2, A, E, B, D, F]
删除后 al 的大小:5
al 的内容:[C, A2, E, B, D]
不支持方法:
al 的大小:5

相关文章