Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa ArrayList và CopyOnWriteArrayList trong Java

Bảng so sánh

Tiêu chíArrayListCopyOnWriteArrayList
Đồng bộ hóa (thread-safe)Không (non-synchronized)Có (thread-safe – copy-on-write)
Hiệu năng ghiNhanh (không khóa)Chậm (copy mảng mới mỗi lần ghi)
Hiệu năng đọcNhanhNhanh (đọc trên snapshot không khóa)
Iterator behaviorFail-fast: ném ConcurrentModificationException nếu sửa đổi khi duyệtFail-safe: iterator hoạt động trên snapshot, không ném exception khi sửa đổi
Xóa khi duyệt (iterator.remove())Hỗ trợKhông hỗ trợ – ném UnsupportedOperationException
Phiên bản Java ra mắtJava 1.2Java 1.5 (java.util.concurrent)
Góijava.utiljava.util.concurrent

Ví dụ ArrayList – iterator.remove() hợp lệ

import java.util.*;

public class ArrayListRemoveDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            String s = itr.next();
            if (s.equals("B")) itr.remove(); // OK
        }
        System.out.println(list); // [A, C]
    }
}

Ví dụ CopyOnWriteArrayList – iterator.remove() gây lỗi

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.*;

public class CowListRemoveDemo {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(Arrays.asList("A", "B", "C"));
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            String s = itr.next();
            System.out.println(s);
            if (s.equals("B")) {
                itr.remove(); // UnsupportedOperationException
            }
        }
    }
}

Khi nào dùng CopyOnWriteArrayList?

  • Môi trường đa luồng, đọc nhiều, ghi ít (read-heavy, write-rare).
  • Cần duyệt an toàn mà không cần synchronized block.
  • Không cần xóa phần tử trong lúc duyệt.