Почему HashSet не может просто использовать внутри битовый массив вместо HashMap, чтобы сэкономить место?

Я вижу, что HashSet в Java внутренне использует HashMap, чтобы проверить, содержит ли HashSet элемент или нет. Разве он не может просто использовать растровое изображение для хранения всех результатов хеширования из строк. Например. Строка abc хэшируется, чтобы сказать, что индекс 12, и мы можем просто установить этот индекс, чтобы показать, что он присутствует. Это сэкономит много места по сравнению с HashMap, поскольку нам не нужно хранить фактические ключи в данных.

abc может превратиться в 12. Но то же самое будет и с почти бесконечностью других струн. Максимальная длина строки равна Integer.MAX_VALUE — существует гораздо больше перестановок массива такого размера, чем диапазон или хэш-код. Итак, с вашим предложением о наборе битов, как вы справляетесь с коллизиями?
Boris the Spider 28.05.2019 22:23

Обратите внимание, что EnumSet действительно использует «битовый массив»: такой подход хорошо работает для перечислений, потому что они плотно упакованы (без пробелов) и, по большей части, довольно малы (большинство перечислений имеют менее 64 элементов, и поэтому могут быть упакованы в одно длинное; но для хранения наборов больших перечислений вам просто нужны дополнительные длинные).

Andy Turner 28.05.2019 22:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если бы HashSet использовался только для поиска contains(), подобная оптимизация была бы возможна. Это все равно было бы опасно, потому что всегда могут возникнуть коллизии хешей. Я думаю, что вы ищете Фильтр Блума (обратите внимание, что фильтр Блума не дает точных ответов, он просто исключает ложные отрицательные значения).

Набор хэшей — это коллекция, а коллекция должна иметь возможность извлекать сохраненные значения. Хэши необратимы, вы не можете вычислить исходную строку из ее хэша.

Другие вопросы по теме