Вопрос

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

Примеры:

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

Решение

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

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

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

Другие советы

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

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

С пейджинговым алгоритмом.

Кстати, совсем недавно по другому вопросу (Двоичный поиск в отсортированном (отображенном в память?) файле в Java), я разработал алгоритм пейджинга, чтобы обойти интервал параметры в API java.nio.MappedByteBuffer.

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

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

Множество индексы ограничены 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

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

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

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

Требуется апгрейд памяти..:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top