2009-05-12 3 views
3

Исключая емкость кучи, существуют ли способы выйти за пределы ограничений Integer.MAX_VALUE в Java?выходят за пределы ограничений Integer.MAX_VALUE в Java

Примеры:

  1. Коллекции ограничиваются Integer.MAX_VALUE.
  2. StringBuilder/StringBuffer ограничиваются Integer.MAX_VALUE.
+0

Какие именно ограничения вы говорите? –

+1

Количество элементов в коллекции, StringBuilder/StringBuffer и т. Д. – Joset

+3

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

ответ

10

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

Аналогичным образом, StringBuilder может построить строку размером 2 ГБ, прежде чем она достигнет предела MAX_VALUE, который более чем подходит для любой практической цели.

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

3

С длинным? Работает на меня.

Редактировать: Ah, уточнение вопроса. Круто. Мой новый и улучшенный ответ:

С алгоритмом поискового вызова.

совпадению, несколько недавно на другой вопрос (Binary search in a sorted (memory-mapped ?) file in java), я взбитый алгоритм подкачки, чтобы обойти ИНТ параметров в API java.nio.MappedByteBuffer.

2

Array индексы ограничены Integer.MAX_VALUE, а не физическим размером массива.

Поэтому максимальный размер массива связан с размером массива.

byte = 1 byte => max 2 Gb data 
char = 2 byte => max 4 Gb data 
int = 4 byte => max 8 Gb data 
long = 8 byte => max 16 Gb data 

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

Short: Integer.MAX_VALUE на самом деле не является пределом, потому что вам нужно много памяти, чтобы достичь предела. Если вы когда-нибудь достичь этого предела вы можете думать об улучшении вашего алгоритма и/или данных макета :)

3

Вы можете создавать свои собственные коллекции, которые имеют long size() на основе исходного кода для этих коллекций. Чтобы иметь более крупные массивы объектов, например, вы можете иметь массив массивов (и сшить их вместе)

Этот подход позволит почти 2^62 элемента.