Các Phương Thức Trong Collections Thao Tác Với Đối Tượng List
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 danh sách, bao gồm tìm kiếm danh sách con, tạo danh sách từ enumeration, tạo danh sách không thể thay đổi, xoay và hoán vị ngẫu nhiên các phần tử, sắp xếp danh sách, và tạo danh sách đồng bộ. 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 List của lớp Collections trong Java:
↳ 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.
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ó 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 <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
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, có 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 một đối tượng của lớp đó.
↳ <T>: Đây là một tham số kiểu generic. Nó cho phép phương thức này hoạt động với bất kỳ loại dữ liệu nào thực hiện giao diện Comparable.
↳ int: Kiểu trả về của phương thức là một số nguyên, đại diện cho chỉ số của phần tử tìm thấy trong danh sách. Nếu không tìm thấy, nó sẽ trả về một số âm.
↳ binarySearch: Tên phương thức tìm kiếm nhị phân trên danh sách đã sắp xếp tăng dần.
↳ List: Đối số đầu tiên là một danh sách.
↳ <? extends Comparable<? super T>> list: Đây là một bound wildcard. Nó có nghĩa là danh sách này chứa các phần tử là các đối tượng có thể so sánh được với đối tượng T hoặc các siêu lớp của T. Điều này đảm bảo rằng các phần tử trong danh sách có thể được so sánh với nhau và với khóa tìm kiếm key.
↳ T key: Đây là đối tượng mà chúng ta muốn tìm kiếm trong danh sách.
Ví dụ minh họa phương thức tìm kiếm nhị phân trên một danh sách đã được sắp xếp.
Ví dụ: Example.java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 3, 5, 7, 9, 11);
int key = 7;
// Tìm kiếm phần tử trong danh sách bằng tìm kiếm nhị phân
int index = Collections.binarySearch(numbers, key);
if (index >= 0) {
System.out.println("Phần tử " + key + " được tìm thấy tại vị trí " + index);
} else {
System.out.println("Phần tử " + key + " không được tìm thấy");
}
}
}
Kết quả của chương trình là:
Ví dụ minh họa phương thức hoán vị ngẫu nhiên các phần tử trong danh sách.
Ví dụ: Example.java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// Hoán vị ngẫu nhiên danh sách
Collections.shuffle(names);
System.out.println("Danh sách sau khi hoán vị ngẫu nhiên: " + names);
}
Kết quả của chương trình là:
[Charlie, Alice, David, Bob]
Ví dụ minh họa phương thức thay thế tất cả các phần tử trong danh sách bằng một phần tử đã cho.
Ví dụ: Example.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie", "David"));
// Thay thế tất cả phần tử trong danh sách bằng "Unknown"
Collections.fill(names, "Unknown");
System.out.println("Danh sách sau khi sử dụng phương thức fill: " + names);
}
}
Kết quả của chương trình là:
fill: [Unknown, Unknown, Unknown, Unknown]
Ví dụ minh họa phương thức lấy số lượng phần tử trong một bộ sưu tập bằng với phần tử đã cho.
Ví dụ: Example.java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Alice", "Charlie", "Alice");
// Tìm số lần xuất hiện của "Alice" trong danh sách
int frequency = Collections.frequency(names, "Alice");
System.out.println("\"Alice\" xuất hiện " + frequency + " lần trong danh sách.");
}
}
Kết quả của chương trình là:
Ví dụ minh họa phương thức sắp xếp danh sách theo thứ tự được quy định bởi bộ so sánh đã cho.
Ví dụ: Example.java
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = Arrays.asList("D", "A", "C", "B");
// Sắp xếp danh sách theo thứ tự ngược lại với Comparator.reverseOrder()
Collections.sort(names, Comparator.reverseOrder());
System.out.println("Danh sách sau khi sắp xếp: " + names);
}
}
Kết quả của chương trình là:
Ví dụ minh họa phương thức này trả về một danh sách đồng bộ, giúp danh sách an toàn khi truy cập từ nhiều luồng.
Ví dụ: Example.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie", "David"));
// Trả về một danh sách đồng bộ
List<String> synchronizedNames = Collections.synchronizedList(names);
// Sử dụng danh sách đồng bộ trong khối synchronized để đảm bảo thread-safe
synchronized (synchronizedNames) {
for (String name : synchronizedNames) {
System.out.println(name);
}
}
}
}
Kết quả của chương trình là:
Bob
Charlie
David
Ví dụ minh họa phương thức này trả về một danh sách không thể thay đổi, giúp bảo vệ danh sách khỏi việc sửa đổi.
Ví dụ: Example.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie", "David"));
// Trả về một danh sách không thể thay đổi
List<String> unmodifiableNames = Collections.unmodifiableList(names);
System.out.println("Danh sách không thể thay đổi: " + unmodifiableNames);
// Cố gắng thay đổi danh sách sẽ ném ra UnsupportedOperationException
try {
unmodifiableNames.add("Eve");
} catch (UnsupportedOperationException e) {
System.out.println("Không thể thêm phần tử vào danh sách không thể thay đổi.");
}
}
}
Kết quả của chương trình là:
Không thể thêm phần tử vào danh sách không thể thay đổi.
Các ví dụ trên cho thấy 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 bạn thực hiện các thao tác thường gặp với danh sách và bộ sưu tập trong Java.
Như vậy, chúng ta đã tìm hiểu chi tiết các phương thức của lớp Collections khi thao tác với đối tượng List. Từ việc sắp xếp danh sách bằng sort(), tìm kiếm hiệu quả bằng binarySearch(), đến việc đảo ngược thứ tự bằng reverse() hay hoán đổi vị trí các phần tử bằng swap(), những công cụ này giúp bạn quản lý và xử lý dữ liệu trong danh sách một cách linh hoạt và mạnh mẽ. Việc nắm vững các phương thức này là rất quan trọng để bạn có thể tối ưu hóa các thao tác với danh sách trong lập trình Java.