Всем привет.
HashSet - класс предствляющий собой хэш таблицу.
Хэш таблица - это структура данных для хранения пар ключей и их значений.
Меня ставит в тупик определение хэш таблицы, а точнее того что она хранит пары. Что в случае HashSet является ключем?
adoonaai
16 уровень
Хэш таблица
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
26 июля 2021, 11:10решение
HashSet это класс представляющий собой структуру данных HashSet.
Этот класс инкапсулирует логику на основе HashMap, то есть HashSet это класс обертка, вокруг HashMap
Фактически тоже самое, что и ArrayList, который под капотом содержит обычный нерасширяемый массив.
Поэтому, у HashSet нет никаких пар, это множество уникальных элементов.
Но технически - внутри это имплементировано как HashMap, поскольку класс HashMap содержит всю необходимую логику по работе с хэшами.
HashMap в свою очередь имеет пары Ключ Значение.
HashSet игнорирует ЗНАЧЕНИЕ, туда записывается заглушка, дамми объект
а в качестве Ключа, собственно хранится сам объект, который мы помещаем в Хэшсэт.
Пример:
этот код вызовет трижды раз метод add
и под капотом, в хэшмапу пойдут три пары ключ-значение:
где PRESENT это синтетический объект заглушка = new Object() который будет вставляться как значение- для любого добавляемого элемента в HashSet (один и тот же объект, создается один раз, и если хоть 1000000 , то все-равно один и тот же будет вставляться)
То есть фактически, ХэшМапа для Set<String> будет:
также советую побродить в Интеллидж Идее по классу HashSet посмотреть как он реализован, там немного кода (если сравнивать с хэшмапой)
+2
Justinian Judge в Mega City One Master
26 июля 2021, 11:17
ХэшМапа это структура данных отображающая ассоциированный массив, то есть связки, маппинг одних значений к другим
Коля - Повар
Маша - Врач
и тд
То есть это как двумерная матрица получается
В случае с ХэшСетом, у нас нет необходимости во второй оси координат, от хэшмапы нам фактически нужно только ее способность упорядчивать по хэшу данные, и как следствие быстро искать, добавлять, удалять.
Поэтому размерность "ЗНАЧЕНИЕ" просто игнорируется объектом заглушкой, а основная размерность и занята нашими значениями, необходимым для сэта
0
Ksenia Volkova Java Developer в DXC Master
26 июля 2021, 11:21
Это все же зависит от того, как глубоко копать.
На верхнем слое - да, HashSet - это хэшмапа, в которой игнорируются значения.
Но сами по себе ключи в этой мапе организованы на основе хэштаблицы, в которой хэши связаны с бакетами.
0
Justinian Judge в Mega City One Master
26 июля 2021, 14:56
Ну да, это уже с какой стороны смотреть, стол квадратный, деревянный или с ножками, список это вроде и не массив, но с другой стороны расширяемый массив и тд.
0
Ksenia Volkova Java Developer в DXC Master
26 июля 2021, 10:32
Хэши, как ни странно...
+1
adoonaai
26 июля 2021, 10:33
А можно, пожалуйста, чуть подробнее. Я слаб в этой теме еще)
0
Ksenia Volkova Java Developer в DXC Master
26 июля 2021, 10:38
По-подробнее - это лучше статью почитать. Эту, например.
Или еще вот тут - там про HashMap, но в основе HashSet тот же HashMap.
+1