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

ความแตกต่างระหว่าง ArrayList และ CopyOnWriteArrayList ใน Java

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