Различия в инициализации массива java

В чем разница между двумя следующими методами инициализации массива:

  • Object[] oArr = new Object[] {new Object(), new Object()};
  • Object[] oArr = {new Object(), new Object()};

Связано ли это с распределением кучи/стека?

Спасибо!

Ответ 1

Нет вообще - это просто разные способы выражения одной и той же вещи.

Вторая форма доступна только в объявлении переменной. Например, вы не можете писать:

foo.someMethod({x, y});

но вы можете написать:

foo.someMethod(new SomeType[] { x, y });

Соответствующим битом спецификации языка Java является раздел 10.6 - Инициализаторы массива:

Инициализатор массива может быть указан в объявлении, или как часть выражения создания массива (§15.10), создавая массив и предоставляя некоторые начальные значения:

Ответ 2

Абсолютно идентичный. Второе разрешено сокращать для первого (только когда, как здесь, это делается как часть объявления переменной.

Ответ 3

В Java все объекты живут в куче, поскольку массивы являются объектами в Java, они живут в стеке.

для этих двух нет разницы в результате, у вас будут два объекта массива с одинаковыми элементами.

Однако иногда вы столкнетесь с ситуациями, когда вы не можете их использовать, например, вы не знаете элементов массива. то вы застряли в этой форме:

Object [] array=new Object[size];

Ответ 4

Есть еще небольшая и запоминающаяся разница!

Вы можете сделать

int[] arr;
arr= {1,2,3}; // Illegal

Но вы можете очень хорошо сделать

int[] arr;
arr = new [] {1,2,3} //Legal

Также, если вы хотите инициализировать позже, вы не сможете выполнить

int arr;
arr = new [] {1,2,3} //Illegal