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

Cách làm ArrayList chỉ đọc (read-only) trong Java

Dùng Collections.unmodifiableList() để tạo view chỉ đọc của ArrayList. View này không cho phép add, remove, set.

Ví dụ tạo read-only ArrayList

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListReadOnly {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("JavaFx"); list.add("Java"); list.add("WebGL"); list.add("OpenCV");
        System.out.println("Original: " + list);
        
        // Tạo view read-only
        List<String> readOnlyList = Collections.unmodifiableList(list);
        System.out.println("Read-only: " + readOnlyList);
        
        // Thử sửa đổi -> Exception
        readOnlyList.add("CoffeeScript"); // UnsupportedOperationException
    }
}

Exception

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
    at ArrayListReadOnly.main(ArrayListReadOnly.java:20)

Đặc điểm quan trọng

  • View, không phải copy: Thay đổi list gốc → view thay đổi theo (và ngược lại nếu view cho phép sửa, nhưng view này không cho).
  • list.add("New") vẫn OK trên list gốc.
  • Iterator của view cũng không hỗ trợ remove().

Java 10+: List.copyOf() - Immutable thực sự

// Tạo immutable list (copy dữ liệu, không liên kết với list gốc)
List<String> immutable = List.copyOf(list);
// Hoặc
List<String> immutable = List.of("JavaFx", "Java", "WebGL", "OpenCV");

Khác biệt:

Đặc điểmunmodifiableList (View)List.copyOf / List.of (Immutable)
Liên kết với list gốcCó (backed by)Không (copy độc lập)
List gốc thay đổi -> ViewThay đổi theoKhông ảnh hưởng
Null elementCho phépKhông cho phép (NPE)
Hiệu suấtNhanh (không copy)Chậm hơn (copy data)

Khuyên dùng: List.copyOf() cho immutable an toàn; unmodifiableList() khi cần view nhẹ, hiệu suất cao.