выйти за рамки ограничений Integer.MAX_VALUE в Java
-
21-08-2019 - |
Вопрос
Если оставить в стороне емкость кучи, есть ли способы выйти за рамки ограничений Integer.MAX_VALUE в Java?
Примеры:
- Коллекции ограничиваются Integer.MAX_VALUE.
- 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.
Требуется апгрейд памяти..:)