HashSet

HashSet

В множествах Set каждый элемент хранится только в одном экземпляре, а разные реализации Set используют разный порядок хранения элементов.

Работа с HashSet основана на HashMap, т.к. HashSet хранит все элементы в свойстве HashMap map.
Структура HashSet
При добавлении нового элемента в HashMap в качестве ключа передаётся сам элемент, для которого потом вычисляется hashCode. А в качестве значения – пустой Dummy-объект. Порядок элементов определяется по сложному алгоритму, основанному на вычислении hashCode каждого элемента. Если производится попытка добавить такой же элемент, как тот, что уже хранится в списке, он не будет добавлен. Сравнение элементов производится с помощью метода equals(), который необходимо переопределить для всех добавляемых объектов, наряду с методом hashCode().

Доступа по значению в HashSet нет. Его значения можно получить только в цикле.

Значения ключей не хранятся, а вычисляются, поэтому для поиска/удаления/вставки не нужно выполнять перебор элементов. Лучшее время выполнения этих операций HashSet показывает когда нет коллизий.

HashSet позволяет добавление значений null.

HashSet не синхронизирован. Если нужно его синхронизировать, можно использовать Collections.synchronizedSet().
Коллекции