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