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

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

int arr[] = new int [5];

и

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

Is arr1 объявлено в стеке или в куче?

5 ответов


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

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

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

int[] blah = {}

а не

int[] blah;
blah = {};

или

return {};

объекты (массивы объектов) выделено в куче.


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

второй делает то же самое, но с номера инициализация значений по умолчанию. Углубляясь, эта единственная строка делает четыре вещи:--3-->

  • объявляет ссылочную переменную массива 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 нужен размер, чтобы выделить соответствующее пространство в куче для нового объекта массива.


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


  • 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
    

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


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