ทั้ง ArrayList และ CopyOnWriteArrayList นำอินเตอร์เฟซ List ไปใช้ แต่มีความแตกต่างสำคัญ:
| ลำดับ | หัวข้อ | ArrayList | CopyOnWriteArrayList |
|---|---|---|---|
| 1 | ซิงโครไนเซชัน | ไม่ซิงโครไนซ์ (Not synchronized) | ซิงโครไนซ์ (Synchronized) - thread-safe |
| 2 | ประสิทธิภาพ | เร็วกว่า (ไม่มี overhead การซิงโครไนซ์) | ช้ากว่า (มี overhead การคัดลอก array) |
| 3 | Fail-safety | Fail-fast - โยน ConcurrentModificationException หากแก้ไขระหว่างวนลูป | Fail-safe - อนุญาตแก้ไขระหว่างวนลูปได้ (ทำงานบน snapshot) |
| 4 | การลบขณะวนลูป | Iterator.remove() ทำงานได้ | Iterator.remove() โยน UnsupportedOperationException |
| 5 | เวอร์ชัน Java | เพิ่มใน Java 1.2 | เพิ่มใน Java 1.5 (Java 5) |
| 6 | แพ็กเกจ | java.util | java.util.concurrent |
ตัวอย่าง ArrayList (ลบขณะวนลูปได้)
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> l = new ArrayList<>();
l.add("A"); l.add("B"); l.add("C");
Iterator<String> itr = l.iterator();
while (itr.hasNext()) {
String s = itr.next();
if (s.equals("B")) itr.remove();
}
System.out.println(l); // [A, C]
}
}
ตัวอย่าง CopyOnWriteArrayList (ลบขณะวนลูปไม่ได้)
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.*;
class CopyOnWriteArrayListDemo extends Thread {
static CopyOnWriteArrayList<String> l = new CopyOnWriteArrayList<>();
public static void main(String[] args) throws InterruptedException {
l.add("A"); l.add("B"); l.add("C");
Iterator<String> itr = l.iterator();
while (itr.hasNext()) {
String s = itr.next();
System.out.println(s);
if (s.equals("B")) {
itr.remove(); // โยน UnsupportedOperationException
}
Thread.sleep(1000);
}
System.out.println(l);
}
}
เลือกใช้: CopyOnWriteArrayList เหมาะสำหรับอ่านมาก เขียนน้อย (read-heavy) ในสภาพแวดล้อม multi-thread