2011-12-26 3 views
8

Когда я создаю новый массив, я делаю что-то вроде этого.Java - Объявление массивов

int[] anArray = {1, 2, 3}; 

Но я видел, как некоторые люди что-то делают.

int[] anArray = new int[] {1, 2, 3}; 

Я понимаю, что он делает, но я не понимаю его цели. Есть ли возможность сделать это одним путем над другим?

Благодаря

ответ

11

Нет никакой разницы в поведении, когда оба действительны. Они описаны в разделе 10.6 и 15.10 спецификации языка Java.

Однако первый синтаксис только действителен при объявлении переменной. Так, например:

public void foo(String[] args) {} 

... 

// Valid 
foo(new String[] { "a", "b", "c" }; 

// Invalid 
foo({"a", "b", "c"}); 

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

+0

Я это знаю. Я говорю только об объявлении массива, как в OP. – Stripies

+4

@JonMannerberg: Ну, неясно, насколько вы знаете тему, когда задаете ей вопрос, и не указываете, какие биты вы * знаете. –

+1

@JonMannerberg: Нет лучшего ответа, чем у самого JON SKEET –

5

Они являются почти то же самое, но первый применим для назначения объекта, как:

int[] anArray = {1, 2, 3}; 

Другой является более globaly как

callingMyMethod(new Object[]{object1,object2}); 

неверный синтаксис будет

callingMyMethod({object1,object2}); 

Давайте считать дальше

Эти инициализации прав:

Object[] objeto={new Object(), new Object()}; 
Object[] objeto=new Object[]{new Object(), new Object()}; 

Также право:

Object[] objeto; 
objeto=new Object[]{new Object(), new Object()} 

Но, как Джон предложил это неправильно:

Object[] objeto; 
objeto={new Object(), new Object()}; 

Почему? Array Initializer И Array Creation Expression

В любом случае оба синтаксиса верны. Нет никакой пользы от одного против другого.

Интересное чтение по этой теме:

Arrays на Oracle Официальная документация

Это также были покрыты на этом thread

+1

Первый синтаксис также подходит для ссылочных типов, если у вас есть значения заранее. –

+0

Да, я плохой, я дважды проверю, и я исправлю – Necronet

+0

Неправильно: это не * присваивание *, что важно, то является ли это значение частью объявления переменной *. Вы не можете использовать первый синтаксис для назначения нового значения ранее объявленной переменной. –

5

Это просто стандарт. Если вы используете:

int[] anArray = new int[] {1, 2, 3}; 

Вы говорите, что каждое число (1,2,3) это int. Он не может быть двойным, плавающим и т. Д. Это просто по соображениям безопасности.

5

Можно использовать второй способ, если декларация должна быть выполнена до инициализации.

int[] arr; 
arr = { 2, 5, 6, 12, 13 }; 

не будет работать, так что вы используете:

int[] arr; 
arr = new int[]{ 2, 5, 6, 12, 13 }; 

вместо этого. Другой способ объявить еще одну переменную:

int[] arr; 
int[] tmparr = { 2, 5, 6, 12, 13 }; 
arr = tmparr; 

Так что, если вы не нужно отделить декларацию от инициализации, это всего лишь вопрос чистого кода (используйте один последовательно).

+0

Из этих сообщений я получаю, что это всего лишь личные предпочтения, это право ? – Stripies

Смежные вопросы