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 своими словами; примеры кода — авторские.