Class Collections

Lớp Collections là một công cụ chứa các phương thức tĩnh (static) giúp bạn làm việc với các tập hợp dữ liệu như danh sách (List), tập hợp (Set), và bản đồ (Map). Nó cung cấp các thao tác như sắp xếp, tìm kiếm, hoặc tạo ra các phiên bản không thể thay đổi của tập hợp.

Thao tác trên tập hợp: Bạn có thể dùng lớp này để thực hiện các tác vụ phổ biến như sắp xếp một danh sách (sort), tìm kiếm một phần tử (binarySearch), hoặc trộn ngẫu nhiên các phần tử trong một danh sách (shuffle).

Bảo vệ tập hợp: Nếu bạn muốn bảo vệ một tập hợp không cho phép thay đổi, lớp Collections cung cấp các phương thức giúp tạo ra một phiên bản không thể chỉnh sửa của tập hợp đó. Ví dụ, Collections.unmodifiableList sẽ tạo ra một danh sách mà không ai có thể thêm, xóa, hay sửa đổi.

Xử lý lỗi: Nếu bạn cố gắng thao tác với một tập hợp không tồn tại (null), các phương thức của lớp Collections sẽ báo lỗi (ném ra ngoại lệ NullPointerException). Điều này giúp tránh lỗi khi làm việc với tập hợp không hợp lệ.

Thay đổi dữ liệu: Một số phương thức trong Collections có thể thay đổi dữ liệu của tập hợp. Nếu tập hợp không cho phép thay đổi, hoặc nếu bạn cố thay đổi dữ liệu trên một tập hợp không thể chỉnh sửa, phương thức sẽ báo lỗi (ném ra ngoại lệ UnsupportedOperationException).

Khai báo Class Collections trong Java

Để sử dụng Class Collections, bạn cần import gói java.util vào đầu file Java của mình.

Cú pháp câu lệnh import:

Cú pháp

import java.util.Collections;

Cú pháp khai báo Class Collections:

Cú pháp

public class Collections
extends Object

Dưới đây là giải thích chi tiết về cú pháp khai báo này:

↳ public class Collections: Đây là định nghĩa của một lớp có tên là Collections. Từ khóa public chỉ ra rằng lớp này có thể được truy cập từ bất kỳ đâu trong chương trình, tức là không bị giới hạn trong cùng một package hoặc module.

↳ extends Object: Từ khóa extends chỉ ra rằng lớp Collections kế thừa từ lớp Object. Trong Java, Object là lớp cha của tất cả các lớp. Điều này có nghĩa là lớp Collections tự động thừa hưởng tất cả các phương thức của lớp Object, như toString(), equals(), hashCode(), v.v.

Vì Object là lớp cha mặc định của mọi lớp trong Java, nên ngay cả khi bạn không viết extends Object, thì mọi lớp trong Java vẫn ngầm kế thừa từ Object. Dòng này chỉ rõ rằng Collections cũng là một lớp thông thường như mọi lớp khác trong Java.

Các trường tĩnh trong lớp Collections

Lớp tiện ích Collections cung cấp một số trường tĩnh (static fields) rất hữu ích, giúp bạn dễ dàng làm việc với các tập hợp rỗng và không thể thay đổi. Việc sử dụng những trường này không chỉ giúp mã của bạn gọn gàng hơn mà còn tối ưu hóa hiệu suất, vì bạn không phải tạo ra các đối tượng mới một cách không cần thiết. Dưới đây là các trường tĩnh phổ biến nhất mà bạn sẽ thường xuyên sử dụng:

↳ static List EMPTY_LIST: Một danh sách rỗng không thể thay đổi. Bạn có thể sử dụng nó để trả về một danh sách rỗng mà không cần tạo một danh sách mới.

↳ static Map EMPTY_MAP: Một bản đồ rỗng không thể thay đổi. Bạn có thể sử dụng nó để trả về một bản đồ rỗng mà không cần tạo một bản đồ mới.

↳ static Set EMPTY_SET: Một tập hợp rỗng không thể thay đổi. Bạn có thể sử dụng nó để trả về một tập hợp rỗng mà không cần tạo một tập hợp mới.

Ví dụ

// Tạo một danh sách rỗng
List<String> emptyList = Collections.emptyList();
System.out.println("Danh sách rỗng: " + emptyList);

// Tạo một bản đồ rỗng
Map<String, Integer> emptyMap = Collections.emptyMap();
System.out.println("Bản đồ rỗng: " + emptyMap);

// Tạo một tập hợp rỗng
Set<Character> emptySet = Collections.emptySet();
System.out.println("Tập hợp rỗng: " + emptySet);

Lưu ý:

↳ Các trường này là tĩnh, nghĩa là bạn có thể truy cập chúng trực tiếp thông qua lớp Collections mà không cần tạo một đối tượng của lớp đó.

↳ Các danh sách, bản đồ và tập hợp rỗng này không thể thay đổi, nghĩa là bạn không thể thêm, xóa hoặc sửa đổi các phần tử của chúng. Nếu bạn cần một danh sách, bản đồ hoặc tập hợp có thể thay đổi, bạn phải tạo một đối tượng mới.

Các phương thức chính trong lớp Collections

Lớp tiện ích Collections cung cấp một bộ sưu tập các phương thức tĩnh mạnh mẽ, được thiết kế để thao tác và xử lý các đối tượng trong Java Collections Framework. Các phương thức này giúp bạn thực hiện nhiều tác vụ phổ biến một cách hiệu quả, từ sắp xếp, tìm kiếm đến đồng bộ hóa. Một trong những nhóm phương thức quan trọng nhất là binarySearch, giúp tìm kiếm một phần tử trong danh sách đã được sắp xếp với tốc độ cao. Dưới đây là cách bạn có thể sử dụng các phương thức này:

↳ static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key): Tìm kiếm phần tử đã cho trong danh sách đã cho bằng thuật toán tìm kiếm nhị phân.

↳ static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c): Tìm kiếm phần tử đã cho trong danh sách đã cho bằng thuật toán tìm kiếm nhị phân.

↳ static <E> List<E> checkedList(List<E> list, Class<E> type): Trả về một view kiểu an toàn động của danh sách đã cho.

↳ static <T> List<T> emptyList(): Trả về một danh sách rỗng (không thể thay đổi).

↳ static <T> ListIterator<T> emptyListIterator(): Trả về một list iterator không có phần tử nào.

↳ static <T> void fill(List<? super T> list, T obj): Thay thế tất cả các phần tử của danh sách đã cho bằng phần tử đã cho.

↳ static int frequency(Collection<?> c, Object o): Trả về số lượng phần tử trong bộ sưu tập đã cho bằng với phần tử đã cho.

↳ static int indexOfSubList(List<?> source, List<?> target):Trả về vị trí bắt đầu của lần xuất hiện đầu tiên của danh sách mục tiêu đã cho trong danh sách nguồn đã cho, hoặc -1 nếu không có lần xuất hiện như vậy.

↳ static int lastIndexOfSubList(List<?> source, List<?> target): Trả về vị trí bắt đầu của lần xuất hiện cuối cùng của danh sách mục tiêu đã cho trong danh sách nguồn đã cho, hoặc -1 nếu không có lần xuất hiện như vậy.

↳ static <T> ArrayList<T> list(Enumeration<T> e): Trả về một danh sách ArrayList chứa các phần tử được trả về bởi enumeration đã cho theo thứ tự chúng được trả về bởi enumeration.

↳ static <T> List<T> nCopies(int n, T o): Trả về một danh sách không thể thay đổi bao gồm n bản sao của đối tượng đã cho.

↳ static voidrotate(List<?> list, int distance): Xoay các phần tử trong danh sách đã cho theo khoảng cách đã cho.

↳ static void shuffle(List<?> list): Hoán vị ngẫu nhiên danh sách đã cho bằng cách sử dụng một nguồn ngẫu nhiên mặc định.

↳ static void shuffle(List<?> list, Random rnd): Hoán vị ngẫu nhiên danh sách đã cho bằng cách sử dụng nguồn ngẫu nhiên đã cho.

↳ static <T> List<T> singletonList(T o): Trả về một danh sách không thể thay đổi chỉ chứa đối tượng đã cho.

↳ static <T extends Comparable<? super T>> void sort(List<T> list): Sắp xếp danh sách đã cho theo thứ tự tăng dần, theo thứ tự tự nhiên của các phần tử của nó.

↳ static <T> void sort(List<T> list, Comparator<? super T> c): Sắp xếp danh sách đã cho theo thứ tự được quy định bởi bộ so sánh đã cho.

↳ static void swap(List<?> list, int i, int j): Hoán đổi các phần tử tại các vị trí đã cho trong danh sách đã cho.

↳ static <T> List<T> synchronizedList(List<T> list):Trả về một danh sách đồng bộ (thread-safe) được hỗ trợ bởi danh sách đã cho.

↳ static <T> List<T> unmodifiableList(List<? extends T> list): Trả về một view không thể thay đổi của danh sách đã cho.

↳ static <T> Queue<T> asLifoQueue(Deque<T> deque): Tạo một view của Deque dưới dạng Last-in-first-out (Lifo) Queue. Điều này có nghĩa là phần tử cuối cùng được thêm vào sẽ là phần tử đầu tiên được lấy ra.

↳ static <E> Queue<E> checkedQueue(Queue<E> queue, Class<E> type): Trả về một view kiểu an toàn động của hàng đợi đã cho. Điều này có nghĩa là các phần tử được thêm vào hoặc lấy ra từ hàng đợi phải tuân theo kiểu đã chỉ định.

↳ static <E> Set<E> checkedSet(Set<E> s, Class<E> type): Trả về một view kiểu an toàn động của tập hợp đã cho.

↳ static <E> NavigableSet<E> checkedNavigableSet(NavigableSet<E> s, Class<E> type): Trả về một view kiểu an toàn động của tập hợp có thể điều hướng đã cho.

↳ static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s, Class<E> type): Trả về một view kiểu an toàn động của tập hợp đã sắp xếp đã cho.

↳ static <E> NavigableSet<E> emptyNavigableSet(): Trả về một tập hợp có thể điều hướng rỗng (không thể thay đổi).

↳ static <T> Set<T> emptySet(): Trả về một tập hợp rỗng (không thể thay đổi).

↳ static <E> SortedSet<E> emptySortedSet(): Trả về một tập hợp đã sắp xếp rỗng (không thể thay đổi).

↳ static <E> Set<E> newSetFromMap(Map<E, Boolean> map): Trả về một tập hợp được hỗ trợ bởi bản đồ đã cho.

↳ static <T> Set<T> singleton(T o): Trả về một tập hợp không thể thay đổi chỉ chứa đối tượng đã cho.

↳ static <T> NavigableSet<T> synchronizedNavigableSet(NavigableSet<T> s): Trả về một tập hợp có thể điều hướng đồng bộ (thread-safe) được hỗ trợ bởi tập hợp có thể điều hướng đã cho.

↳ static <T> Set<T> synchronizedSet(Set<T> s): Trả về một tập hợp đồng bộ (thread-safe) được hỗ trợ bởi tập hợp đã cho.

↳ static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s): Trả về một tập hợp đã sắp xếp đồng bộ (thread-safe) được hỗ trợ bởi tập hợp đã sắp xếp đã cho.

↳ static <T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T> s): Trả về một view không thể thay đổi của tập hợp có thể điều hướng đã cho.

↳ static <T> Set<T> unmodifiableSet(Set<? extends T> s): Trả về một view không thể thay đổi của tập hợp đã cho.

↳ static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s): Trả về một view không thể thay đổi của tập hợp đã sắp xếp đã cho.

↳ 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.

↳ static <T> boolean addAll(Collection<? super T> c, T... elements): Thêm tất cả các phần tử đã cho vào bộ sưu tập đã cho.

↳ static <T> void copy(List<? super T> dest, List<? extends T> src): Sao chép tất cả các phần tử từ một danh sách vào danh sách khác.

↳ static boolean disjoint(Collection<?> c1, Collection<T?> c2): Trả về true nếu hai bộ sưu tập đã cho không có phần tử chung nào.

↳ static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll): Trả về phần tử lớn nhất của bộ sưu tập đã cho, theo thứ tự tự nhiên của các phần tử của nó.

↳ static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp): Trả về phần tử lớn nhất của bộ sưu tập đã cho, theo thứ tự được quy định bởi bộ so sánh đã cho.

↳ static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll): Trả về phần tử nhỏ nhất của bộ sưu tập đã cho, theo thứ tự tự nhiên của các phần tử của nó.

↳ static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp): Trả về phần tử nhỏ nhất của bộ sưu tập đã cho, theo thứ tự được quy định bởi bộ so sánh đã cho.

↳ static <T> boolean replaceAll(List<T> list, T oldVal, T newVal): Thay thế tất cả các lần xuất hiện của một giá trị đã cho trong một danh sách bằng một giá trị khác.

↳ static void reverse(List<?> list): Đảo ngược thứ tự của các phần tử trong danh sách đã cho.

↳ static <T> Comparator<T> reverseOrder(): Trả về một comparator áp đặt thứ tự ngược của thứ tự tự nhiên trên một bộ sưu tập các đối tượng thực hiện giao diện Comparable.

↳ static <T> Comparator<T> reverseOrder(Comparator<T> cmp): Trả về một comparator áp đặt thứ tự ngược của comparator đã cho.

Như vậy, chúng ta đã tìm hiểu về lớp tiện ích Collections. Đây không phải là một cấu trúc dữ liệu, mà là một tập hợp các phương thức tĩnh hữu ích để thao tác, tìm kiếm và đồng bộ hóa các đối tượng Collection. Việc nắm vững các phương thức này, từ sắp xếp, tìm kiếm nhị phân đến việc tạo ra các tập hợp an toàn cho đa luồng hoặc các tập hợp bất biến, sẽ giúp bạn làm việc với các Collections Framework một cách hiệu quả và chuyên nghiệp hơn rất nhiều trong Java.

"Để giúp bạn dễ dàng nắm bắt, trong phần tiếp theo, chúng ta sẽ đi sâu vào các phương thức trong lớp Collections, được nhóm theo từng loại đối tượng mà chúng thao tác, bao gồm List, Queue, Set, Map và các phương thức dùng chung cho tất cả các bộ sưu tập(Collection)."

Câu Nói Truyền Cảm Hứng

“Không ai sinh ra đã giỏi. Mọi thành công đều bắt đầu từ một bước nhỏ.” – Lao Tzu

Không Gian Tích Cực

“Chúc bạn một ngày mới đầy năng lượng và sự sáng tạo, luôn tiến về phía trước.”