Trong bài viết này, chúng ta sẽ cùng tìm hiểu về lớp Hashset trong Java. Chúng ta sẽ tìm hiểu về các phương thức và thao tác khác nhau cùng với sự trợ giúp của các ví dụ dẫn chứng.
Lớp Hashset trong Java
Lớp HashSet cung cấp các chức năng của cấu trúc dữ liệu bảng băm. Nó thực hiện triển khai cho Set Interface.
Tạo HashSet
Để tạo HashSet, trước tiên chúng ta phải thêm gói package java.util.HashSet. Sau đây là cách chúng ta có thể tạo HashSet trong Java.
1 |
HashSet<Integer> a = new HashSet<>(6, 0.67); |
Ở đây, chúng ta đã tạo một HashSet có tên là a.
Chú ý biểu thức: new HashSet<>(6, 0.67)
- Ở đây, tham số đầu tiên là dung lượng và tham số thứ hai là hệ số nạp đầy.
- Dung lượng của HashSet này là 6. Có nghĩa là, nó có thể lưu trữ 6 phần tử.
- Hệ số nạp đầy của HashSet này là 0,67. Điều này có nghĩa là, bất cứ khi nào HashSet của chúng ta được lấp đầy bởi 67%, các phần tử sẽ được chuyển sang một bảng băm mới có kích thước gấp đôi kích thước của bảng băm ban đầu.
- Nếu ta không truyền các đối số này thì theo mặc định,
- Dung lượng của HashSet sẽ là 16.
- Hệ số nạp đầy sẽ là 0,75.
Các phương thức của HashSet
1. Chèn các phần tử
- Phương thức add(): Chèn phần tử được chỉ định vào tập hợp.
- Phương thức addAll(): Chèn tất cả các phần tử của tập hợp được chỉ định vào tập hợp.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import java.util.Set; import java.util.HashSet; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(52); tap_hop2.add(43); tap_hop2.addAll(tap_hop); System.out.println(tap_hop2); } } |
Kết quả:
1 2 |
[34, 13] [34, 52, 43, 13] |
2. Truy cập các phần tử
Để truy cập các phần tử của HashSet, chúng ta có thể sử dụng phương thức iterator(). Để sử dụng phương pháp này, chúng ta phải thêm gói package java.util.Iterator.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(52); tap_hop2.add(43); tap_hop2.addAll(tap_hop); Iterator<Integer> phan_tu = tap_hop2.iterator(); while(phan_tu.hasNext()) { System.out.print(phan_tu.next()); System.out.print(" "); } } } |
Kết quả:
1 2 |
[34, 13] 34 52 43 13 |
3. Xóa các phần tử
- Phương thức remove(): Xóa phần tử được chỉ định khỏi tập hợp.
- Phương thức removeAll(): Xóa tất cả các phần tử khỏi tập hợp.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(52); tap_hop2.add(43); tap_hop2.addAll(tap_hop); boolean kq = tap_hop2.remove(11); System.out.println(kq); boolean kq2 = tap_hop2.removeAll(tap_hop2); System.out.println(kq2); } } |
Kết quả:
1 2 3 |
[34, 13] false true |
Trong đoạn mã trên, vì 11 không có trong tập hợp, do vậy khi ta thực hiện tap_hop2.remove(11) thì sẽ nhận được kết quả là false
Các thao tác với Set
1. Liên hợp
Chúng ta có thể sử dụng phương thức addAll() để kết hợp các tập hợp với nhau.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(52); tap_hop2.add(43); System.out.println(tap_hop2); tap_hop2.addAll(tap_hop); System.out.println(tap_hop2); } } |
Kết quả:
1 2 3 |
[34, 13] [52, 43] [34, 52, 43, 13] |
2. Tìm tập giao của 2 tập hợp
Để thực hiện tìm phần giao nhau giữa hai tập hợp, chúng ta có thể sử dụng phương thức retainAll().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(52); tap_hop2.add(43); System.out.println(tap_hop2); tap_hop2.retainAll(tap_hop); System.out.println("Tap giao cua 2 tap hop: " + tap_hop2); } } |
Kết quả:
1 2 3 |
[34, 13] [52, 43] Tap giao cua 2 tap hop: [] |
3. Tính phép hiệu của các tập hợp
Để tính toán phép hiệu giữa hai tập hợp, chúng ta có thể sử dụng phương thức removeAll().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(13); tap_hop2.add(43); System.out.println(tap_hop2); tap_hop2.removeAll(tap_hop); System.out.println(tap_hop2); } } |
Kết quả:
1 2 3 |
[34, 13] [43, 13] [43] |
4. Kiểm tra tập con
Để kiểm tra xem một tập hợp có phải là tập con của một tập hợp khác hay không, chúng ta có thể sử dụng phương thức containsAll().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.util.Set; import java.util.HashSet; import java.util.Iterator; class Main { public static void main(String[] args) { Set<Integer> tap_hop = new HashSet<>(); tap_hop.add(13); tap_hop.add(34); System.out.println(tap_hop); Set<Integer> tap_hop2 = new HashSet<>(); tap_hop2.add(13); tap_hop2.add(43); System.out.println(tap_hop2); boolean kq = tap_hop2.containsAll(tap_hop); String kq2; System.out.println("Tap hop 1 co phai la tap con cua tap hop 2 hay khong? " + (kq2 = (kq == false)? "Khong" : "Co")); } } |
Kết quả:
1 2 3 |
[34, 13] [43, 13] Tap hop 1 co phai la tap con cua tap hop 2 hay khong? Khong |
Các phương thức khác
Phương thức | Mô tả |
clone() | Tạo một bản sao chép của HashSet. |
contains() | Trả về giá trị kiểu boolean nếu tồn tại một phần tử có trong tập hợp. |
isEmpty() | Kiểm tra HashSet rỗng hay không. |
size() | Trả về kích thước của HashSet. |
clear() | Xóa hết tất cả các phần tử khỏi HashSet. |
Tại sao nên sử dụng HashSet?
- Trong Java, HashSet thường được sử dụng nếu chúng ta phải truy cập các phần tử một cách ngẫu nhiên. Đó là do các phần tử trong bảng băm được truy cập bằng mã băm.
- Mã băm của một phần tử là một định danh duy nhất giúp xác định phần tử trong bảng băm.
- HashSet không được chứa các phần tử trùng lặp. Do đó, mỗi phần tử của HashSet có một mã băm duy nhất.
Chú ý: HashSet không được đồng bộ hóa. Nếu xảy ra trường hợp nhiều luồng thực thi cùng truy cập HashSet cùng một lúc và một trong các luồng thực hiện sửa đổi tập hợp, thì sau đó, nó phải được đồng bộ hóa ở bên ngoài.
Trên đây là khái niệm và ví dụ cơ bản về lớp Hashset trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài tiếp theo trên tek4 nhé!
P/s: Cảm ơn mọi người!