Подтвердить что ты не робот

Объявление массивов без использования "нового" ключевого слова в Java

Есть ли разница между следующими двумя объявлениями?

int arr[] = new int [5];

и

int arr1[] = {1,2,3,4,5};

Объявляется arr1 в стеке или в куче?

4b9b3361

Ответ 1

Существует очевидная разница в том, что каждый имеет все нули, а другой содержит [1..5].

Но это единственное различие. Оба являются 5-элементными массивами int, оба распределены одинаково. Простое синтаксическое удобство объявлять с помощью фигурных скобок и new.

Обратите внимание, что эта форма может использоваться только при объявлении массива:

int[] blah = {}

Но не

int[] blah;
blah = {};

или

return {};

Объекты (массивы - объекты) выделяются в куче.

Ответ 2

Первая строка помещает один новый объект в объект массива heap -an, содержащий четыре элемента - каждый элемент, содержащий int со значением по умолчанию 0.

Второй делает то же самое, но инициализирует с нестандартными значениями. Идя глубже, эта единственная строка делает четыре вещи:

  • Объявляет ссылочную переменную типа int с именем arr1
  • Создает массив int длиной пять (пять элементов).
  • Заполняет элементы массива значениями 1,2,3,4,5
  • Назначает новый объект массива к опорной переменной arr1

Если вы используете массив объектов вместо примитивов:

MyObject[] myArray = new MyObject[3];

то у вас есть один объект массива в куче, с тремя нулевыми ссылками типа MyObject, но у вас нет объектов MyObject. Следующим шагом будет создание некоторых объектов MyObject и назначение им позиции индекса в массиве, на который ссылается myArray.

myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();

В заключение: массивы всегда должны иметь размер в момент их построения. JVM нуждается в размере, чтобы выделить соответствующее пространство в куче для нового объекта массива.

Ответ 3

Я согласен с другими ответами, наиболее часто ваш массив будет выделен на кучу (независимо от того, какое из двух объявлений вы используете). Однако, согласно верхнему ответу в Может ли Java выделить список в стеке?, "в особых случаях виртуальная машина java может выполнить анализ escape и решить выделить объекты... на стеке". Я считаю, что это правда. Поэтому ответ на ваш вопрос: это зависит. Обычно на куче.

Ответ 4

  • new int [5] может использоваться как для назначения, так и инициализация, но {1, 2} может использоваться только как объявление с инициализацией. (Обратите внимание, что new int[] {1, 2} также может использоваться как назначение и инициализация)

  • new int [5] устанавливает все записи в ноль, но {1, 2} и new int[] {1, 2} устанавливает 1 и 2 в соответствующие записи.

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

    int arr[] = new int [5];
    // arr: object reference to the array
    

    или

    int arr[] = {1, 2, 3, 4, 5};
    // arr: object reference to the array
    

Полезные материалы:

Ответ 5

Objects находятся в heap. Arrays являются object type в Java-языке программирования. Официальная документация здесь