Есть ли разница между следующими двумя объявлениями?
int arr[] = new int [5];
и
int arr1[] = {1,2,3,4,5};
Объявляется arr1
в стеке или в куче?
Есть ли разница между следующими двумя объявлениями?
int arr[] = new int [5];
и
int arr1[] = {1,2,3,4,5};
Объявляется arr1
в стеке или в куче?
Существует очевидная разница в том, что каждый имеет все нули, а другой содержит [1..5].
Но это единственное различие. Оба являются 5-элементными массивами int, оба распределены одинаково. Простое синтаксическое удобство объявлять с помощью фигурных скобок и new
.
Обратите внимание, что эта форма может использоваться только при объявлении массива:
int[] blah = {}
Но не
int[] blah;
blah = {};
или
return {};
Объекты (массивы - объекты) выделяются в куче.
Первая строка помещает один новый объект в объект массива heap -an, содержащий четыре элемента - каждый элемент, содержащий int со значением по умолчанию 0.
Второй делает то же самое, но инициализирует с нестандартными значениями. Идя глубже, эта единственная строка делает четыре вещи:
Если вы используете массив объектов вместо примитивов:
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
являются object type
в Java-языке программирования. Официальная документация здесь