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

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

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

Ответы [ 4 ]

42 голосов
/ 08 ноября 2010

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

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

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

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

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


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

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

11 голосов
/ 08 ноября 2010

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

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

0 голосов
/ 08 ноября 2010

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

0 голосов
/ 08 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...