выйти за пределы ограничений Integer.MAX_VALUE в Java - PullRequest
4 голосов
/ 12 мая 2009

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

Примеры:

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

Ответы [ 6 ]

9 голосов
/ 12 мая 2009

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

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

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

3 голосов
/ 12 мая 2009

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

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

3 голосов
/ 12 мая 2009

с длинным? У меня работает.

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

С алгоритмом подкачки.

По совпадению, совсем недавно для другого вопроса ( Бинарный поиск в отсортированном (отображенном в памяти?) Файле в java ) , я включил алгоритм подкачки для обхода int параметры в API java.nio.MappedByteBuffer.

2 голосов
/ 12 мая 2009

Массив Индексы ограничены 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 на самом деле не предел, потому что вам нужно много памяти, чтобы фактически достичь этого предела. Если вы когда-нибудь достигнете этого предела, вы можете подумать об улучшении вашего алгоритма и / или макета данных:)

1 голос
/ 12 мая 2009

Требуется обновление памяти ..:)

1 голос
/ 12 мая 2009

Да, с классом BigInteger.

...