Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง ArrayList และ CopyOnWriteArrayList ในการเขียนโปรแกรม Java


ทั้ง ArrayList และ CopyOnWriteArrayList เป็นการนำอินเทอร์เฟซรายการไปใช้ใน Java แต่ก็มีความแตกต่างบางอย่างเช่นกัน

ต่อไปนี้เป็นข้อแตกต่างที่สำคัญระหว่าง ArrayList และ CopyOnWriteArrayList

ซีเนียร์ เลขที่ คีย์ ArrayList CopyOnWriteArrayList
1 การซิงโครไนซ์ ArrayList ไม่ได้ซิงโครไนซ์โดยธรรมชาติ CopyOnWriteArrayList ถูกซิงโครไนซ์ในลักษณะอื่น นั่นคือ ครั้งละหนึ่งเธรดเท่านั้นที่สามารถเข้าถึงวัตถุได้
2 ประสิทธิภาพ ArrayList นั้นรวดเร็วเนื่องจากไม่มีการซิงโครไนซ์ในการทำงาน การซิงโครไนซ์ทำให้ CopyOnWriteArrayList ทำงานช้าลง
3 ไม่ปลอดภัย ตัววนซ้ำ ArrayList ล้มเหลวอย่างรวดเร็วและโยน ConcurrentModificationException ในการแก้ไขระหว่างการสำรวจ CopyOnWriteArrayList ไม่ปลอดภัยและอนุญาตให้แก้ไขระหว่างการสำรวจ
4 ลบองค์ประกอบ ตัววนซ้ำของ ArrayList สามารถดำเนินการลบในขณะที่ทำซ้ำได้ CopyOnWriteArrayList ไม่สามารถดำเนินการลบในขณะที่ทำซ้ำ มิฉะนั้นจะส่งข้อยกเว้นรันไทม์ UnsupportedOperationException
5 แนะนำ Java ArrayList เก่ากว่า CopyOnWriteArrayList เนื่องจากถูกเพิ่มใน java เวอร์ชัน 1.2 เพิ่มคลาส CopyOnWriteArrayList ใน java เวอร์ชัน 1.5 (หรือ java 5)
6 แพ็คเกจ คลาส ArrayList มีอยู่ในแพ็คเกจ 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")){
            // Throws RuntimeException
            itr.remove();
         }
         Thread.sleep(1000);
      }
      System.out.println(l);
   }
}

ผลลัพธ์

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