English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Control Flow

Java Array

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

Обработка исключений Java

Java List

Java Queue (queue)

Java Map collection

Java Set collection

Java Input/Output (I/O)

Java Reader/Writer

Java other topics

Java HashSet класс

In this tutorial, we will learn about the Java HashSet class. We will learn different hash set methods and operations with examples.

The Java Collections framework's HashSet class provides the functionality of the hash table data structure.

It implementsSet interface.

Create a hash set

To create a hash set, we must first import the java.util.HashSet package.

After importing the package, you can create a hash set in Java.

// HashSet with 8 capacity and 0.75 load factor
HashSet<Integer> numbers = new HashSet<>(8, 0.75);

Here, we create a hash set named numbers.

Note, the new part HashSet<>(8, 0.75). Here, the first parameter isCapacityand the second parameter isLoad factor.

  • capacity - The capacity of this hash set is 8. This means that it can store 8 elements.

  • loadFactor - The load factor of this hash set is 0.6. This means that as soon as our hash set is filled to 60%, elements will be moved to a new hash table, which is twice the size of the original hash table.

Default capacity and load factor

Создание хеш-таблицы без определения ее емкости и фактора загрузки возможно. Например,

// HashSet сdefault емкостью и фактором загрузки
HashSet<Integer> numbers1 = new HashSet<>();

по умолчанию

  • емкость хеш-сета будет равна 16

  • фактор загрузки будет равен 0.75

методы HashSet

Класс HashSet предоставляет различные методы, которые позволяют нам выполнять различные операции над集合ом.

вставка элемента в HashSet

  • add() - Вставка указанного элемента в набор

  • addAll() - Вставка всех элементов указанного набора в набор

например:

import java.util.HashSet;
class Main {
    public static void main(String[] args) {
        HashSet<Integer> evenNumber = new HashSet<>();
        // использование метода add()
        evenNumber.add(2);
        evenNumber.add(4);
        evenNumber.add(6);
        System.out.println("HashSet: " + evenNumber);
        HashSet<Integer> numbers = new HashSet<>();
        
        // использование метода addAll()
        numbers.addAll(evenNumber);
        numbers.add(5);
        System.out.println("Новый HashSet: " + numbers);
    }
}

Результат вывода

HashSet: [2, 4, 6]
Новый HashSet: [2, 4, 5, 6]

доступ к элементам HashSet

Чтобы получить доступ к элементам хеш-сета, мы можем использовать метод iterator(). Для использования этого метода我们必须 импортировать пакет java.util.Iterator. Например:

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);
        // вызов метода iterator()
        Iterator<Integer> iterate = numbers.iterator();
        System.out.print("использование HashSet с Iterator: ");
        // доступ к элементам
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Результат вывода

HashSet: [2, 5, 6]
использование HashSet с Iterator: 2, 5, 6

удаление элемента

  • remove() - Удаление указанного элемента из набора

  • removeAll() - Удаление всех элементов из набора

например:

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);
        //Использование метода remove()
        boolean value1 = numbers.remove(5);
        System.out.println("Удален ли элемент с значением 5? " + value1);
        boolean value2 = numbers.removeAll(numbers);
        System.out.println("Удалили все элементы? " + value2);
    }
}

Результат вывода

HashSet: [2, 5, 6]
Удален ли элемент с значением 5? true
Удалили все элементы? true

Методы операций над множествами

Различные методы класса HashSet также могут использоваться для выполнения различных операций над множествами.

Объединение множеств Set

Чтобы выполнить объединение между двумя множествами, мы можем использовать метод addAll(). Например

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);
        //Объединение множеств
        numbers.addAll(evenNumbers);
        System.out.println("Объединение: " + numbers);
    }
}

Результат вывода

HashSet1: [2, 4]
HashSet2: [1, 3]
Объединение: [1, 2, 3, 4]

Объединение множеств Set

Чтобы выполнить交集 между двумя множествами, мы можем использовать метод retainAll(). Например

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);
        //Объединение множеств
        evenNumbers.retainAll(primeNumbers);
        System.out.println("Объединение: " + evenNumbers);
    }
}

Результат вывода

HashSet1: [2, 3]
HashSet2: [2, 4]
Объединение: [2]

Разность множеств Set

Чтобы вычислить разность между двумя множествами, мы можем использовать метод removeAll(). Например,

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);
        //Разность между HashSet1 и HashSet2
        primeNumbers.removeAll(oddNumbers);
        System.out.println("Разность: " + primeNumbers);
    }
}

Результат вывода

HashSet1: [2, 3, 5]
HashSet2: [1, 3, 5]
Разность: [2]

Подмножество множества Set

Чтобы проверить, является ли один набор подмножеством другого, можно использовать метод containsAll(). Например,

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);
        //Проверка, является ли primeNumbers подмножеством numbers
        boolean result = numbers.containsAll(primeNumbers);
        System.out.println("HashSet2 является подмножеством HashSet1? " + result);
    }
}

Результат вывода

HashSet1: [1, 2, 3, 4]
HashSet2: [2, 3]
HashSet2 является подмножеством HashSet1? true

Другие методы HashSet

МетодыОписание
clone()Создать копию HashSet
contains()Искать指定的 элемент в HashSet и вернуть булево значение
isEmpty()Проверить, пуст ли HashSet
size()Вернуть размер HashSet
clear()Удалить все элементы из HashSet

Почему выбирают HashSet?

В Java, если нам нужно случайный доступ к элементам, то обычно используется HashSet. Это потому, что элементы хэш-таблицы доступы по хэш-коду.

Hashcode является уникальным идентификатором, который помогает идентифицировать элементы хэш-таблицы.

HashSet не может содержать повторяющиеся элементы. Поэтому у каждого элемента хэш-сборника есть уникальный хэш-код.

Внимание: HashSet не синхронизирован. Это означает, что если несколько потоков одновременноアクセス к хэш-сборнику и один поток изменяет хэш-сборник, то он должен быть синхронизирован внешне.