2017-02-17 2 views
1

Я новичок в java, и я хочу взять большой массив размера ввода в java. но в том, что дает мне некоторую Runtime Error - NZEC, я не знаю об этом, и я также провел некоторое исследование этой ошибки, но не нашел ничего, связанного с моей проблемой.Как взять массив большого размера в java

long n=sc.nextLong();// n can be upto 10^9; 
    long a[]=new long[n];// declaring array of n; 

также я столкнулся ошибку во время компиляции, которая:

error: incompatible types: possible lossy conversion from long to int 

может кто-нибудь, пожалуйста, решить мою проблему ?? этот

+0

Какая строка вызывает именно ту ошибку (полная стек)? Пожалуйста, задайте вопрос и добавьте всю соответствующую информацию. –

+0

Какая именно ошибка Java вы получаете? Обратите внимание, что выделение пространства для такого массива может быть трудным для Java/базовой ОС, потому что не только этот объем памяти должен быть бесплатным, но также должен быть непрерывный кусок памяти такой большой. –

ответ

0

размеры массивов ограничены Int размера в Java. поэтому вам нужно всегда создавать свой массив с размерами int. вы должны взять n как int. и заменить длинный n=sc.nextLong();// n can be upto 10^9;by int n=sc.nextInt();// n can be upto 10^9;

Он будет работать отлично.

1

Размеры массива ограничены размером int (т. Е. Около 2 миллиардов). Вы пытаетесь инициализировать его с помощью long. Либо прочтите размер в int, либо произведите длинный с long a[]=new long[(int)n];.

Я рекомендую первому избегать любых тонких ошибок.

+0

Отбрасывание long в int может по-прежнему вызывать проблему, из-за которой вы блокируете ошибку. Единственный правильный способ сделать это - никогда не использовать длинный размер в первую очередь. – Thiefster

+0

@Thiefster Именно поэтому я рекомендовал первый подход. – Kayaman

0

Размер массивов в Java относится к категории int. Поскольку long может хранить больше данных, чем int, некоторые данные могут потеряться при преобразовании с long в int.

0

Индекс массива не может быть определен с тех пор, как вы сделали, но только с междунар как размер массива ограничен Integer максимальное значение

Но в вашем случае это не должно быть проблемой, как Integer макс значение составляет 2^31-1. (более 2 миллиардов), и вы нуждаетесь в неполном размере: 10^9 (1 миллиард).
Так оно и должно быть хорошо заменить:

long n=sc.nextLong();// n can be upto 10^9; 

по

int n=sc.nextInt();// n can be upto 10^9; 
0

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

0

Как и другие ответы, массивные индексы основаны на 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 млрд ГБ).

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

Смежные вопросы