Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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


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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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