Вы можете получить намек на то, что доступ к массивам осуществляется с использованием целочисленных литералов. Так как числовые литералы достигают Integer.MAX_VALUE
, это количество индексов (и элементов), которое может иметь ваш массив. arshajii brings up another hint.
Ваша проблема связана только с тем, что вашему приложению недостаточно памяти, чтобы создать много long
s, но этого достаточно, чтобы создать много short
s. Помните, что когда инициализируется массив, его элементы также инициализируются значением по умолчанию. Для примитивных типов это значение равно 0
или 0.0
. Что следует учесть (в зависимости от среды)
Long[] array = new Long[33554432]; // allocation would work
long[] array = new long[33554432]; // allocation would fail
Это потому, что ссылочные типы инициализируются null
ссылки и поэтому только ссылка занимает пространство. Таким образом, вы можете начать добавлять элементы, но это также в конечном итоге потерпит неудачу.
Запустите приложение с большей памятью.
Вы можете попробовать [увеличение кучи Java] (http://stackoverflow.com/a/1566026/2071828), но обратите внимание, что 'short' составляет 16 бит, а' long' - 64 бит, вам требуется _a lot_ больше места. –
Из * Memory * - это не то, что Array * не может содержать столько элементов, просто потому, что JVM не может создать/выделить массив, большой по текущей системе (с предоставленными параметрами JVM). – user2246674
Вам действительно нужно хранить 33 миллиона значений в этих массивах? Или большинство ячеек будет пустым? Рассмотрим использование карты, где ключ является числовым индексом. – Kenster