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