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.

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àmMô 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.