Как и другие ответы, массивные индексы основаны на int
, и массив, вероятно, не является правильной структурой данных для того, что вы хотите сделать.
Давайте рассмотрим использование памяти. Массив имеет 12-байтовый заголовок объекта, за которым следуют n * v
байт для фактических данных (где n
- размер массива, а v
- размер типа, который вы храните в нем).
Например, давайте рассмотрим следующее объявление массива:
long[] longArray = new long[Integer.MAX_VALUE];
Долгий имеет 64 бита или 8 байт. Integer.MAX_VALUE равно 2147483647. Это означает, что ваш массив будет принимать 17179869188 байт, или, другими словами, 17 ГБ ОЗУ.
Возможно ли создать более крупные массивы? Определенно: вы можете создать многомерный массив (каждое дополнительное измерение будет умножать доступные позиции до Integer.MAX_VALUE), но использование памяти будет ужасным. Рассмотрим следующий пример:
long[] multiArray = new long[5][5];
Этот массив имеет 25 позиций, так что по моей предыдущей формуле можно вычислить это занимает 25 * 8 + 12
байт, или 212
байт, а 2-мерный массив представляет собой массив из массивов, так что каждый внутренний массив также имеет заголовок объекта, поэтому мы говорим о байтах (5 * 8 + 12) * 5 + 12
или 272
байт. Теперь представьте, что вы делаете это на больших уровнях.
long[] multiArray = new long[Integer.MAX_VALUE][Integer.MAX_VALUE];
Это занимает (Integer.MAX_VALUE * 8 + 12) * Integer.MAX_VALUE + 12
байт или 3.689348813882917e19 байт (36.89 экзабайт, или 36,89 млрд ГБ).
Если вам действительно нужно работать с этими объемами данных, вам, вероятно, нужен вычислительный кластер, а не массив.
Какая строка вызывает именно ту ошибку (полная стек)? Пожалуйста, задайте вопрос и добавьте всю соответствующую информацию. –
Какая именно ошибка Java вы получаете? Обратите внимание, что выделение пространства для такого массива может быть трудным для Java/базовой ОС, потому что не только этот объем памяти должен быть бесплатным, но также должен быть непрерывный кусок памяти такой большой. –