HashSet

HashSet — класс из пакета java.util, реализующий интерфейс Set поверх хеш-таблицы (внутри использует HashMap). Хранит только уникальные элементы и не гарантирует порядок их перебора.

Большинство операций — add, remove, contains — выполняются за константное время в среднем случае, при условии что метод hashCode() хранимых объектов хорошо распределяет значения.

HashSet допускает один null-элемент. Не является потокобезопасным.

Зачем нужен

  • Когда нужно быстро проверять, входит ли элемент в коллекцию.

  • Когда необходимо удалить дубликаты из последовательности.

  • Когда порядок элементов не важен, важна только уникальность.

Конструкторы

  • HashSet() — пустое множество с начальной ёмкостью 16 и фактором загрузки 0.75.

  • HashSet(int initialCapacity) — пустое множество с заданной ёмкостью.

  • HashSet(int initialCapacity, float loadFactor) — задаются оба параметра.

  • HashSet(Collection<? extends E> c) — множество из элементов коллекции (дубликаты отбрасываются).

Популярные методы

  • add(E e) — добавить элемент, true если его ещё не было.

  • remove(Object o) — удалить элемент, true если был.

  • contains(Object o) — проверить наличие.

  • size(), isEmpty(), clear().

  • iterator() — итератор по элементам.

  • addAll(Collection c), retainAll(Collection c), removeAll(Collection c) — операции над множествами.

Пример 1. Уникальные элементы

import java.util.HashSet;

public class Unique {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Arduino");
        set.add("ESP32");
        set.add("Arduino");
        set.add("Raspberry Pi");

        System.out.println(set);
        System.out.println("Размер: " + set.size());
    }
}

Вывод (порядок может отличаться):

[ESP32, Arduino, Raspberry Pi]
Размер: 3

Пример 2. Проверка вхождения

import java.util.HashSet;

public class ContainsCheck {
    public static void main(String[] args) {
        HashSet<Integer> pins = new HashSet<>();
        pins.add(2);
        pins.add(4);
        pins.add(5);
        pins.add(6);

        System.out.println("Пин 4 занят? " + pins.contains(4));
        System.out.println("Пин 9 занят? " + pins.contains(9));
    }
}

Вывод:

Пин 4 занят? true
Пин 9 занят? false

Пример 3. Удаление дубликатов из списка

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class Deduplicate {
    public static void main(String[] args) {
        List<String> input = Arrays.asList("red", "green", "red", "blue", "green", "blue");
        HashSet<String> unique = new HashSet<>(input);
        System.out.println("Было: " + input);
        System.out.println("Стало: " + unique);
    }
}

Вывод (порядок может отличаться):

Было: [red, green, red, blue, green, blue]
Стало: [red, green, blue]

Пример 4. Возвращаемое значение add

import java.util.HashSet;

public class AddResult {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        System.out.println(set.add("A"));
        System.out.println(set.add("B"));
        System.out.println(set.add("A"));
    }
}

Вывод:

true
true
false

Пример 5. Итерация

import java.util.HashSet;

public class Iterate {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(10);
        set.add(20);
        set.add(30);

        int sum = 0;
        for (int v : set) sum += v;
        System.out.println("Сумма: " + sum);
    }
}

Вывод:

Сумма: 60

Пример 6. Объединение, пересечение, разность

import java.util.Arrays;
import java.util.HashSet;

public class SetOps {
    public static void main(String[] args) {
        HashSet<Integer> a = new HashSet<>(Arrays.asList(1, 2, 3, 4));
        HashSet<Integer> b = new HashSet<>(Arrays.asList(3, 4, 5, 6));

        HashSet<Integer> union = new HashSet<>(a);
        union.addAll(b);
        System.out.println("Объединение: " + union);

        HashSet<Integer> inter = new HashSet<>(a);
        inter.retainAll(b);
        System.out.println("Пересечение: " + inter);

        HashSet<Integer> diff = new HashSet<>(a);
        diff.removeAll(b);
        System.out.println("Разность: " + diff);
    }
}

Вывод (порядок может отличаться):

Объединение: [1, 2, 3, 4, 5, 6]
Пересечение: [3, 4]
Разность: [1, 2]

Пример 7. Подсчёт уникальных слов

import java.util.HashSet;

public class UniqueWords {
    public static void main(String[] args) {
        String text = "alash ed wiki alash ed arduino esp32 alash";
        HashSet<String> words = new HashSet<>();
        for (String w : text.split(" ")) words.add(w);
        System.out.println("Уникальных слов: " + words.size());
        System.out.println(words);
    }
}

Вывод (порядок может отличаться):

Уникальных слов: 5
[alash, esp32, arduino, ed, wiki]

Пример 8. Хранение пользовательских объектов

import java.util.HashSet;
import java.util.Objects;

public class CustomObjects {
    static class Sensor {
        String name;
        int pin;
        Sensor(String name, int pin) { this.name = name; this.pin = pin; }

        @Override public boolean equals(Object o) {
            if (!(o instanceof Sensor)) return false;
            Sensor s = (Sensor) o;
            return pin == s.pin && Objects.equals(name, s.name);
        }
        @Override public int hashCode() { return Objects.hash(name, pin); }
        @Override public String toString() { return name + "@" + pin; }
    }

    public static void main(String[] args) {
        HashSet<Sensor> set = new HashSet<>();
        set.add(new Sensor("line_L", 14));
        set.add(new Sensor("line_C", 15));
        set.add(new Sensor("line_L", 14));
        System.out.println(set);
        System.out.println("Размер: " + set.size());
    }
}

Вывод (порядок может отличаться):

[line_L@14, line_C@15]
Размер: 2

См. также

Примечание

Описание основано на официальной документации Oracle Java SE 21 API (https://docs.oracle.com/en/java/javase/21/docs/api/). Материал распространяется на условиях Oracle Free Documentation License. Тексты статьи написаны редакцией AlashEd своими словами; примеры кода — авторские.