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ểm | unmodifiableList (View) | List.copyOf / List.of (Immutable) |
|---|---|---|
| Liên kết với list gốc | Có (backed by) | Không (copy độc lập) |
| List gốc thay đổi -> View | Thay đổi theo | Không ảnh hưởng |
| Null element | Cho phép | Không cho phép (NPE) |
| Hiệu suất | Nhanh (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.