Trong bài này, chúng ta sẽ tìm hiểu về class Hashset trong Java. Chúng ta sẽ tìm hiểu về các hàm và toán tử khác nhau của HashSet qua các ví dụ.
Class HashSet của Collections framework trong Java cung cấp các chức năng của cấu trúc dữ liệu hash table.
Nó triển khai Set interface.
Nội dung chính
1. Tạo một Hashset
Để tạo HashSet, trước tiên chúng ta phải import gói java.util.HashSet.
Khi đã import xong, chúng ta có thể tạo các HashSet trong Java theo cách dưới dây.
// HashSet with 8 capacity and 0.75 load factor
HashSet<Integer> numbers = new HashSet<>(8, 0.75);
Ở đây, chúng ta đã tạo ra một HashSet có tên numbers.
Chú ý, phần HashSet<>(8, 0.75). Ở đây, tham số đầu tiên là capacity và tham số thứ hai là loadFactor .
- capacity – Dung lượng của HashSet này là 8. Ý nghĩa: nó có thể lưu trữ 8 phần tử.
- loadFactor – Hệ số tải của HashSet này là 0,6. Điều này có nghĩ là, khi nào HashSet của chúng ta được lấp đầy 60%, các phần tử được chuyển sang hash table mới có kích thước gấp đôi hash table ban đầu.
Công suất và hệ số tải mặc định
Có thể tạo hash table mà không cần xác định công suất và hệ số tải của nó. Ví dụ,
// HashSet with default capacity and load factor
HashSet<Integer> numbers1 = new HashSet<>();
Theo mặc định,
- công suất của HashSet sẽ là 16
- hệ số tải sẽ là 0,75
2. Các hàm của Hashset
Class HashSet cung cấp hàm khác nhau mà cho phép chúng ta thực hiện các toán tử khác nhau trên set.
3. Chèn các phần tử vào Hashset
- add() – chèn phần tử được chỉ định vào set
- addAll() – chèn tất cả các phần tử của collection đã chỉ định vào set
Ví dụ,
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> evenNumber = new HashSet<>();
// Using add() method
evenNumber.add(2);
evenNumber.add(4);
evenNumber.add(6);
System.out.println("HashSet: " + evenNumber);
HashSet<Integer> numbers = new HashSet<>();
// Using addAll() method
numbers.addAll(evenNumber);
numbers.add(5);
System.out.println("New HashSet: " + numbers);
}
}
Kết quả
HashSet: [2, 4, 6]
New HashSet: [2, 4, 5, 6]
4. Truy cập các phần tử của Hashset
Để truy cập các phần tử của Hashset, chúng ta có thể sử dụng hàm iterator(). Để sử dụng hàm này, chúng ta phải import gói java.util.Iterator. Ví dụ,
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
import java.util.HashSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("HashSet: " + numbers);
// Calling iterator() method
Iterator<Integer> iterate = numbers.iterator();
System.out.print("HashSet using Iterator: ");
// Accessing elements
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Kết quả
HashSet: [2, 5, 6]
HashSet using Iterator: 2, 5, 6,
5. Loại bỏ các phần tử
- remove() – xóa phần tử đã chỉ định khỏi set
- removeAll() – loại bỏ tất cả các phần tử khỏi set
Ví dụ,
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("HashSet: " + numbers);
// Using remove() method
boolean value1 = numbers.remove(5);
System.out.println("Is 5 removed? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + value2);
}
}
Kết quả
HashSet: [2, 5, 6]
Is 5 removed? true
Are all elements removed? true
6. Các toán tử của Set
Các hàm khác nhau của HashSetclasscũng có thể được sử dụng để thực hiện các hoạt động set khác nhau.
7. Lấy phần hợp
Để lấy phần hợp của 2 set, chúng ta có thể sử dụng hàm addAll(). Ví dụ,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> evenNumbers = new HashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("HashSet1: " + evenNumbers);
HashSet<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(3);
System.out.println("HashSet2: " + numbers);
// Union of two set
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
Kết quả
HashSet1: [2, 4]
HashSet2: [1, 3]
Union is: [1, 2, 3, 4]
8. Lấy phần giao
Để lấy phần giao của 2 set, chúng ta có thể sử dụng hàm retainAll(). Ví dụ
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("HashSet1: " + primeNumbers);
HashSet<Integer> evenNumbers = new HashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("HashSet2: " + evenNumbers);
// Intersection of two sets
evenNumbers.retainAll(primeNumbers);
System.out.println("Intersection is: " + evenNumbers);
}
}
Kết quả
HashSet1: [2, 3]
HashSet2: [2, 4]
Intersection is: [2]
9. Tính hiệu của các set
Để tính hiệu hai set, chúng ta có thể sử dụng hàm removeAll(). Ví dụ,
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
primeNumbers.add(5);
System.out.println("HashSet1: " + primeNumbers);
HashSet<Integer> oddNumbers = new HashSet<>();
oddNumbers.add(1);
oddNumbers.add(3);
oddNumbers.add(5);
System.out.println("HashSet2: " + oddNumbers);
// Difference between HashSet1 and HashSet2
primeNumbers.removeAll(oddNumbers);
System.out.println("Difference : " + primeNumbers);
}
}
Kết quả
HashSet1: [2, 3, 5]
HashSet2: [1, 3, 5]
Difference: [2]
10. Tập con
Để kiểm tra xem một set có phải là tập con của set khác hay không, chúng ta có thể sử dụng hàm containsAll(). Ví dụ,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("HashSet1: " + numbers);
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("HashSet2: " + primeNumbers);
// Check if primeNumbers is a subset of numbers
boolean result = numbers.containsAll(primeNumbers);
System.out.println("Is HashSet2 is subset of HashSet1? " + result);
}
}
Kết quả
HashSet1: [1, 2, 3, 4]
HashSet2: [2, 3]
Is HashSet2 is a subset of HashSet1? true
11. Các hàm khác của Hashset
Hàm | Mô tả |
clone() | Tạo một bản sao của HashSet |
contains() | Tìm kiếm phần tử đã chỉ định trong HashSet và trả về kết quả boolean |
isEmpty() | Kiểm tra xem HashSet có trống không |
size() | Trả về kích thước của HashSet |
clear() | Loại bỏ tất cả các phần tử khỏi HashSet |
Để tìm hiểu thêm về các hàm Hashset, hãy truy cập Java Hashset (tài liệu Java chính thức) .
12. Tại sao cần sử dụng Hashset?
Trong Java, HashSet thường được sử dụng khi chúng ta cần truy cập các phần tử ngẫu nhiên. Đó là bởi vì các phần tử trong hashtable được truy cập bằng hash code.
Hash code của một phần tử là định danh duy nhất giúp xác định phần tử trong hash table.
HashSet không thể chứa các phần tử trùng lặp. Do đó, mỗi phần tử của HashSet có một hashcode duy nhất.
Lưu ý: Hashset không được đồng bộ hóa. Đó là nếu nhiều luồng truy cập tập băm cùng một lúc và một trong các luồng đó sửa đổi hashset thì nó phải được đồng bộ hóa ở bên ngoài.