Объявление массивов без использования ключевого слова " 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. Официальная документация здесь