Java 中 ArrayList 和 CopyOnWriteArrayList 的區別


以下為 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[]) {

      // create an array list
      CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList();
      System.out.println("Initial size of al: " + al.size());

      // add elements to the array list
      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("Size of al after additions: " + al.size());

      // display the array list
      System.out.println("Contents of al: " + al);

      // Remove elements from the array list
      al.remove("F");
      al.remove(2);
      System.out.println("Size of al after deletions: " + al.size());
      System.out.println("Contents of al: " + al);

      try{
         Iterator<String> iterator = al.iterator();
         while(iterator.hasNext()) {
            iterator.remove();
         }
      }catch(UnsupportedOperationException e) {
         System.out.println("Method not supported:");
      }
      System.out.println("Size of al: " + al.size());
   }
}

這將生成以下結果 -

輸出

Initial size of al: 0
Size of al after additions: 7
Contents of al: [C, A2, A, E, B, D, F]
Size of al after deletions: 5
Contents of al: [C, A2, E, B, D]
Method not supported:
Size of al: 5

更新於: 2020 年 6 月 21 日

3K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始吧
廣告