Các Phương Thức Trong Collections Thao Tác Với Đối Tượng Map
Các phương thức tĩnh trong lớp Collections cung cấp các tiện ích để thao tác với các bản đồ, bao gồm tạo bản đồ rỗng, tạo bản đồ không thể thay đổi, tạo bản đồ đồng bộ và tạo view kiểu an toàn động. Dưới đây là danh sách tất cả các phương thức thao tác với các đối tượng Map của lớp Collections trong Java:
↳ static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType, Class<V> valueType): Trả về một view kiểu an toàn động của bản đồ đã cho.
↳ static <K,V> NavigableMap<K,V> checkedNavigableMap(NavigableMap<K,V> m, Class<K> keyType, Class<V> valueType): Trả về một view kiểu an toàn động của bản đồ có thể điều hướng đã cho.
↳ static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K,V> m, Class<K> keyType, Class<V> valueType): Trả về một view kiểu an toàn động của bản đồ đã sắp xếp đã cho.
↳ static <K,V> Map<K,V> emptyMap(): Trả về một bản đồ rỗng (không thể thay đổi).
↳ static <K,V> NavigableMap<K,V> emptyNavigableMap(): Trả về một bản đồ có thể điều hướng rỗng (không thể thay đổi).
↳ static <K,V> SortedMap<K,V> emptySortedMap(): Trả về một bản đồ đã sắp xếp rỗng (không thể thay đổi).
↳ static <K,V> Map<K,V> singletonMap(K key, V value): Trả về một bản đồ không thể thay đổi, chỉ ánh xạ khóa đã cho đến giá trị đã cho.
↳ static <K,V> Map<K,V> synchronizedMap(Map<K,V> m): Trả về một bản đồ đồng bộ (thread-safe) được hỗ trợ bởi bản đồ đã cho.
↳ static <K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m): Trả về một bản đồ có thể điều hướng đồng bộ (thread-safe) được hỗ trợ bởi bản đồ có thể điều hướng đã cho.
↳ static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m): Trả về một bản đồ đã sắp xếp đồng bộ (thread-safe) được hỗ trợ bởi bản đồ đã sắp xếp đã cho.
↳ static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m): Trả về một view không thể thay đổi của bản đồ đã cho.
↳ static <K,V> NavigableMap<K,V> unmodifiableNavigableMap(NavigableMap<K,? extends V> m): Trả về một view không thể thay đổi của bản đồ có thể điều hướng đã cho.
↳ static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m): Trả về một view không thể thay đổi của bản đồ đã sắp xếp đã cho.
Giải thích về cú pháp và cách biểu diễn các phương thức trong Java Collections:
Cú pháp của các phương thức trong Java Collections, đặc biệt là những phương thức sử dụng generic như checkedMap, có thể khiến người mới bắt đầu cảm thấy hơi phức tạp. Tuy nhiên, khi hiểu rõ từng phần của cú pháp, bạn sẽ thấy nó rất mạnh mẽ và linh hoạt.
Cú pháp chi tiết:
Cú pháp
static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType, Class<V> valueType)
Dưới đây là giải thích chi tiết về cú pháp khai báo này:
↳ static: Phương thức này là một phương thức tĩnh, nghĩa là bạn có thể gọi nó trực tiếp từ lớp Collections mà không cần tạo đối tượng của lớp đó.
↳ <K,V>: Đây là phần khai báo generic type. Nó cho phép phương thức làm việc với các kiểu dữ liệu khác nhau cho key và value của map.
↳ Map<K,V>: Kiểu trả về của phương thức là một interface Map, với key có kiểu K và value có kiểu V.
↳ checkedMap: Tên phương thức — tạo một view (bộ bao) của map với cơ chế kiểm tra kiểu tại runtime.
↳ Map<K,V> m: Bản đồ gốc mà chúng ta muốn kiểm tra kiểu.
↳ Class<K> keyType: Kiểu của key mà chúng ta muốn kiểm tra.
↳ Class<V> valueType: Kiểu của value mà chúng ta muốn kiểm tra.
Ví dụ minh họa phương thức trả về một view kiểu an toàn động của bản đồ đã cho, giúp đảm bảo rằng tất cả các phần tử được thêm vào bản đồ tuân theo kiểu khóa và giá trị đã chỉ định.
Ví dụ: Example.java
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Example {
public static void main(String[] args) {
Map rawMap = new HashMap(); // Bản đồ không kiểm tra kiểu
rawMap.put("one", 1);
rawMap.put(2, "two"); // Thêm một phần tử sai kiểu
// Trả về một view kiểu an toàn động của bản đồ
Map<String, Integer> checkedMap = Collections.checkedMap(rawMap, String.class, Integer.class);
try {
checkedMap.put("three", 3); // Hợp lệ
checkedMap.put(4, "four"); // Gây lỗi vì khóa không phải là String
} catch (ClassCastException e) {
System.out.println("Lỗi: Thêm phần tử không hợp lệ vào checkedMap.");
}
}
}
Kết quả của chương trình là:
Ví dụ minh họa phương thức trả về một bản đồ rỗng không thể thay đổi. Khi cố gắng thay đổi bản đồ này, nó sẽ ném ra một UnsupportedOperationException.
Ví dụ: Example.java
import java.util.Collections;
import java.util.Map;
public class Example {
public static void main(String[] args) {
Map<String, Integer> emptyMap = Collections.emptyMap();
System.out.println("Bản đồ rỗng: " + emptyMap);
// Cố gắng thêm phần tử vào bản đồ rỗng sẽ gây lỗi
try {
emptyMap.put("one", 1);
} catch (UnsupportedOperationException e) {
System.out.println("Không thể thay đổi bản đồ rỗng.");
}
}
}
Kết quả của chương trình là:
Không thể thay đổi bản đồ rỗng.
Ví dụ minh họa phương thức trả về một bản đồ không thể thay đổi, chỉ chứa một ánh xạ khóa đã cho đến giá trị đã cho.
Ví dụ: Example.java
import java.util.Collections;
import java.util.Map;
public class Example {
public static void main(String[] args) {
Map<String, Integer> singletonMap = Collections.singletonMap("one", 1);
System.out.println("Bản đồ chỉ có một phần tử: " + singletonMap);
// Cố gắng thêm hoặc sửa đổi bản đồ này sẽ gây lỗi
try {
singletonMap.put("two", 2);
} catch (UnsupportedOperationException e) {
System.out.println("Không thể thay đổi singletonMap.");
}
}
}
Kết quả của chương trình là:
Không thể thay đổi singletonMap.
Ví dụ minh họa phương thức trả về một bản đồ đồng bộ (thread-safe), giúp bản đồ có thể được truy cập an toàn từ nhiều luồng.
Ví dụ: Example.java
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Example {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
// Trả về một bản đồ đồng bộ
Map<String, Integer> synchronizedMap = Collections.synchronizedMap(map);
// Truy cập bản đồ đồng bộ trong khối synchronized để đảm bảo an toàn
synchronized (synchronizedMap) {
for (Map.Entry<String, Integer> entry : synchronizedMap.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}
}
Kết quả của chương trình là:
two = 2
Ví dụ minh họa phương thức trả về một view không thể thay đổi của bản đồ đã cho. Bất kỳ nỗ lực nào để thay đổi bản đồ này sẽ dẫn đến UnsupportedOperationException.
Ví dụ: Example.java
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Example {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
// Trả về một bản đồ không thể thay đổi
Map<String, Integer> unmodifiableMap = Collections.unmodifiableMap(map);
System.out.println("Bản đồ không thể thay đổi: " + unmodifiableMap);
// Cố gắng thêm hoặc sửa đổi bản đồ này sẽ gây lỗi
try {
unmodifiableMap.put("three", 3);
} catch (UnsupportedOperationException e) {
System.out.println("Không thể thay đổi unmodifiableMap.");
}
}
}
Kết quả của chương trình là:
Không thể thay đổi unmodifiableMap.
Các ví dụ trên minh họa cách sử dụng một số phương thức quan trọng trong Collections. Những phương thức này giúp đảm bảo rằng các thao tác trên bản đồ trong Java an toàn và tuân theo các quy tắc về kiểu dữ liệu và tính bất biến.
Như vậy, chúng ta đã tìm hiểu các phương thức của lớp Collections được thiết kế để thao tác với đối tượng Map. Mặc dù các phương thức này không nhiều như khi làm việc với List hoặc Set, nhưng chúng đóng vai trò quan trọng trong việc tạo ra các Map an toàn cho đa luồng hoặc các bản đồ bất biến. Nắm vững những phương thức này sẽ giúp bạn quản lý các bản đồ một cách an toàn và hiệu quả hơn trong các ứng dụng Java của mình.