ทั้ง 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