Lớp HashSet Java: Hướng Dẫn Cho Người Mới Bắt Đầu

Giới Thiệu

Xin chào, các nhà phát triển Java tương lai! Hôm nay, chúng ta sẽ bơi lội vào thế giới kỳ diệu của HashSet trong Java. Đừng lo nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn qua cuộc hành trình này bước bước, như thế tôi đã làm cho nhiều học viên khác trong những năm dạy học. Hãy tưởng tượng HashSet như là một chiếc hộp ma thuật có thể chứa các mục duy nhất - không cho phép trùng lặp! Nó như là một chiếcdrawer đặc biệt nơi bạn chỉ có thể đặt một chiếc của mỗi loại mũi nhọn. Hãy bắt đầu nào!

Java - HashSet

Khai Báo Lớp

Trong Java, HashSet là một phần của Khung Cộng Tác Java (Java Collections Framework). Để sử dụng nó, trước tiên chúng ta cần nhập nó:

import java.util.HashSet;

Khai báo cơ bản của HashSet như thế này:

HashSet<E> hs = new HashSet<E>();

Ở đây, 'E' là một dấu chỗ cho loại phần tử bạn muốn lưu trữ trong HashSet của mình. Ví dụ, nếu bạn muốn lưu trữ các chuỗi:

HashSet<String> fruitBasket = new HashSet<String>();

Tham Số

Khi tạo một HashSet, bạn có thể xác định hai tham số tùy chọn:

  1. Khả năng ban đầu: Số lượng "bucket" mà HashSet sẽ sử dụng để lưu trữ các phần tử.
  2. Hệ số tải: Một chiều đo lường về mức độ đầy của HashSet trước khi nó tự động tăng kích thước.

Đừng lo quá nhiều về những điều này vào lúc này. Hãy tưởng tượng chúng là các cài đặt nâng cao cho hộp ma thuật của bạn!

Các Hàm Khởi Tạo Của Lớp

HashSet cung cấp bốn hàm khởi tạo. Hãy xem từng hàm của chúng:

// Hàm khởi tạo 1: Tạo một HashSet trống với khả năng ban đầu mặc định (16) và hệ số tải (0.75)
HashSet<String> set1 = new HashSet<>();

// Hàm khởi tạo 2: Tạo một HashSet chứa các phần tử của bộ sưu tập được xác định
Collection<String> collection = Arrays.asList("Apple", "Banana", "Cherry");
HashSet<String> set2 = new HashSet<>(collection);

// Hàm khởi tạo 3: Tạo một HashSet trống với khả năng ban đầu được xác định và hệ số tải mặc định (0.75)
HashSet<String> set3 = new HashSet<>(20);

// Hàm khởi tạo 4: Tạo một HashSet trống với khả năng ban đầu và hệ số tải được xác định
HashSet<String> set4 = new HashSet<>(20, 0.8f);

Các Phương Pháp Của Lớp

Dưới đây là bảng các phương pháp thường được sử dụng của HashSet:

Phương Pháp Mô Tả
add(E e) Thêm phần tử được xác định vào bộ này nếu nó chưa tồn tại
clear() Xóa tất cả các phần tử khỏi bộ này
contains(Object o) Trả về true nếu bộ này chứa phần tử được xác định
isEmpty() Trả về true nếu bộ này không chứa phần tử
remove(Object o) Xóa phần tử được xác định khỏi bộ này nếu nó có tồn tại
size() Trả về số lượng phần tử trong bộ này

Các Phương Pháp Kế Thừa

HashSet kế thừa các phương pháp từ các lớp cha của nó. Một số phương pháp nổi bật bao gồm:

  • Từ Set: addAll(), containsAll(), equals(), hashCode(), removeAll(), retainAll()
  • Từ Collection: iterator(), toArray()
  • Từ Object: clone(), finalize(), getClass(), notify(), notifyAll(), wait()

Ví Dụ Thêm Phần Tử Vào HashSet

Hãy đặt kiến thức của chúng ta vào thực hành với một ví dụ thú vị. Tưởng tượng chúng ta đang tạo một chương trình để theo dõi các hương vị bánh kem độc đáo trong cửa hàng của chúng ta:

import java.util.HashSet;

public class IceCreamShop {
public static void main(String[] args) {
// Tạo một HashSet mới để lưu trữ các hương vị bánh kem
HashSet<String> flavors = new HashSet<>();

// Thêm một số hương vị
flavors.add("Vanilla");
flavors.add("Chocolate");
flavors.add("Strawberry");
flavors.add("Mint Chip");

// Thử thêm một trùng lặp
boolean added = flavors.add("Vanilla");

System.out.println("Vanilla được thêm lại? " + added);
System.out.println("Các hương vị bánh kem của chúng ta: " + flavors);
System.out.println("Chúng ta có " + flavors.size() + " hương vị duy nhất!");

// Kiểm tra xem chúng ta có một hương vị cụ thể hay không
String searchFlavor = "Rocky Road";
if (flavors.contains(searchFlavor)) {
System.out.println("Có, chúng ta có " + searchFlavor + "!");
} else {
System.out.println("Xin lỗi, chúng ta không có " + searchFlavor + ".");
}

// Xóa một hương vị
flavors.remove("Strawberry");
System.out.println("Cập nhật các hương vị sau khi xóa Strawberry: " + flavors);
}
}

Đầu Ra

Khi bạn chạy chương trình này, bạn sẽ thấy gì đó như thế này:

Vanilla được thêm lại? false
Các hương vị bánh kem của chúng ta: [Vanilla, Mint Chip, Chocolate, Strawberry]
Chúng ta có 4 hương vị duy nhất!
Xin lỗi, chúng ta không có Rocky Road.
Cập nhật các hương vị sau khi xóa Strawberry: [Vanilla, Mint Chip, Chocolate]

Hãy phân tích lại những gì đã xảy ra:

  1. Chúng ta đã tạo một HashSet có tên là flavors để lưu trữ các hương vị bánh kem của mình.
  2. Chúng ta đã thêm bốn hương vị: Vanilla, Chocolate, Strawberry và Mint Chip.
  3. Chúng ta đã thử thêm Vanilla lại, nhưng add() đã trả về false vì HashSet không cho phép trùng lặp.
  4. Chúng ta đã in ra tất cả các hương vị của mình. Lưu ý rằng thứ tự có thể khác với cách chúng ta thêm chúng - HashSet không duy trì thứ tự chèn.
  5. Chúng ta đã kiểm tra xem có hương vị Rocky Road hay không bằng cách sử dụng contains(). Chúng ta không có, vì vậy nó đã in ra một thông báo "xin lỗi".
  6. Cuối cùng, chúng ta đã xóa Strawberry và in ra các hương vị đã cập nhật.

Và thế là! Bạn đã tạo ra HashSet đầu tiên của mình và sử dụng một số phương pháp quan trọng nhất của nó. Nhớ rằng, HashSet rất tuyệt vời khi bạn cần lưu trữ các phần tử duy nhất và không quan tâm đến thứ tự. Nó như một chiếc túi đáu mà mỗi đáu có màu khác - bạn có thể dễ dàng kiểm tra xem có màu cụ thể nào, nhưng bạn không thể kiểm soát thứ tự chúng ra khi bạn đổ túi đáu ra.

Khi bạn tiếp tục hành trình Java của mình, bạn sẽ tìm thấy HashSet rất hữu ích trong nhiều tình huống. Hãy tiếp tục tập luyện, và sớm bạn sẽ trở thành một chuyên gia HashSet! Chúc bạn có những giờ lập trình vui vẻ!

Credits: Image by storyset