Теоретический предел для количества ключей (объектов), которые могут быть сохранены в HashMap?

Существует ли теоретический предел для количества ключевых записей, которые могут быть сохранены в HashMap, или это чисто зависит от доступной памяти кучи?

Кроме того, в какой структуре данных лучше всего хранить очень большое количество объектов (скажем, несколько сотен тысяч объектов)?

4 ответа

Решение

Существует ли теоретический предел для количества ключевых записей, которые могут быть сохранены в HashMap, или это просто зависит от доступной памяти heapmemory?

Глядя на документацию этого класса, я бы сказал, что теоретический предел Integer.MAX_VALUE (2 31 -1 = 2147483647) элементов.

Это потому, что для правильной реализации этого класса size() метод обязан вернуть int представляет количество пар ключ / значение.

Из документации HashMap.size()

Возвращает: количество отображений значения ключа в этой карте

Примечание. Этот вопрос очень похож на то, сколько данных может содержать максимум список.


В какой структуре данных лучше всего хранить очень большое количество объектов (скажем, несколько сотен тысяч объектов)?

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

HashMap содержит значения в массиве, который может содержать до Integer.MAX_VALUE, Но это не учитывает столкновения. каждый Entry имеет next поле, которое также является записью. Таким образом разрешаются коллизии (два или более объекта с одинаковым хеш-кодом). Так что я бы не сказал, что есть какой-либо предел (кроме доступной памяти)

Обратите внимание, что если вы превысите Integer.MAX_VALUEвы получите неожиданное поведение от некоторых методов, таких как size(), но get() а также put() все еще будет работать. И они будут работать, потому что hashCode() любого объекта вернет intследовательно, по определению каждый объект будет вписываться в карту. И тогда каждый объект столкнется с существующим.

Я согласен с @Bozho's и добавлю, что вы должны внимательно прочитать Javadoc на HashMap. Обратите внимание, как обсуждаются начальная емкость и коэффициент загрузки, и как они влияют на производительность HashMap.

HashMap отлично подходит для хранения больших наборов данных (если у вас не хватает ключей или памяти), но производительность может быть проблемой.

Возможно, вам придется обратиться к распределенным кешам / сеткам данных, если вы обнаружите, что не можете манипулировать наборами данных, которые вам нужны, в одной программе Java/JVM.

Теоретического ограничения не существует, но есть ограничение по сегментам для хранения различных цепочек ввода (хранящихся под другим хеш-ключом). Как только вы достигнете этого предела, каждое новое добавление приведет к коллизии хешей - но это не проблема, за исключением производительности...

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