Разница между массивом int [] и массивом int []

234

Недавно я думал о разнице между двумя способами определения массива:

  1. int[] array
  2. int array[]

Есть ли разница?

mslot
источник

Ответы:

282

Они семантически идентичны. int array[]Синтаксис был добавлен только программистам помощи C привыкает к Java.

int[] array гораздо предпочтительнее и менее запутанным.

skaffman
источник
55
[] Является частью ТИПА, а не ИМЯ. Для меня это самая большая разница.
Андре Шалелла
4
@Andre - и в C, [] это часть объявления, а не спецификатор объявления, следовательно, int array[]синтаксис. Также логично ... в некотором роде. :)
Кос
1
Си играет в эту маленькую игру :) И я нахожу ее очаровательной :) Даже с такими ... указателями. «Правильный» синтаксис c для указателей - int * imAPointer. Это глупо и аккуратно.
ScarletAmaranth
4
int array[]имеет больше смысла для меня. Что вы думаете об этой декларации? int[] x, y? Это yмассив или нет? Может быть, а может и нет. Только гуру Java могут ответить с уверенностью ....
user1508893
24
В случае int[] x, y, yявляется массивом (потому что []принадлежит типу), а в случае int x[], y, yне является массивом ( []принадлежит переменной).
Triang3l
172

Есть одно небольшое отличие, если вы объявляете более одной переменной в одном объявлении:

int[] a, b;  // Both a and b are arrays of type int
int c[], d;  // WARNING: c is an array, but d is just a regular int

Обратите внимание, что это плохой стиль кодирования, хотя компилятор почти наверняка поймает вашу ошибку в тот момент, когда вы попытаетесь его использовать d.

Адам Розенфилд
источник
52

Нет никакой разницы.

Я предпочитаю type[] nameформат в это ясно, что переменная является массивом (меньше оглядываясь, чтобы выяснить, что это такое).

РЕДАКТИРОВАТЬ:

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

int[] foo, bar; // both are arrays
int foo[], bar; // foo is an array, bar is an int.
TofuBeer
источник
27

Нет, это одно и то же. тем не мение

byte[] rowvector, colvector, matrix[];

эквивалентно:

byte rowvector[], colvector[], matrix[][];

Взято из спецификации Java . Что означает, что

int a[],b;
int[] a,b;

разные. Я бы не рекомендовал ни одну из этих многочисленных деклараций. Легче всего читать (вероятно):

int[] a;
int[] b;
Иштар
источник
3
Однако рекомендуется использовать одно объявление для каждого идентификатора вместо объявления нескольких идентификаторов в одной строке.
rsp
@rsp - Полностью согласен, отредактировал лучшую практику. Тем не менее, это наводит на мысль, что такое хорошая практика.
Иштар
25

Из раздела 10.2 Спецификации языка Java :

[] Может появиться как часть типа в начале объявления, или как часть объявления для определенной переменной, или и того и другого, как в этом примере:

 byte[] rowvector, colvector, matrix[];

Эта декларация эквивалентна:

byte rowvector[], colvector[], matrix[][];

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

К счастью, я не думаю, что когда- либо видел этот (действительный) код:

String[] rectangular[] = new String[10][10];
Джон Скит
источник
Спасибо, я почесал голову над этим. Как ни странно, когда гуглил название вопроса, я ничего не нашел ...
Йоав
3
+1 Я согласен на запрет второй формы. +1 тоже, потому что я не понимал, что вы можете смешивать 'n' матч как int[] a[];- это никогда не будет неясным ;-)
Богемный
13

Нет разницы.

Цитата из Солнца :

[]Может появиться как часть типа в начале декларации, или в качестве части описания для конкретной переменной, или обоих, как в этом примере:byte[] rowvector, colvector, matrix[];

Эта декларация эквивалентна: byte rowvector[], colvector[], matrix[][];

Ювал Адам
источник
11

Там нет никакой разницы между ними; оба объявляют массив ints. Тем не менее, первое предпочтительнее, поскольку оно хранит информацию о типе в одном месте. Последнее действительно поддерживается только для программистов на C / C ++, переходящих на Java.

Люк Вудворд
источник
11

Здесь нет никакой разницы; тем не мение,

double[] items = new double[10];

является предпочтительным, так как он четко указывает, что тип является массивом.

Аарон Маенпаа
источник
1
двойные предметы [] действительно есть для программистов на Си
Стив Куо
@ Стив, Наверное, поэтому я продолжаю так делать. :-)
Пол Томблин
Можно выдвинуть контраргумент, что double items [] четко указывает тип, а затем и то, что элементы просто являются массивом - все зависит от того, с чем вам удобно.
MetroidFan2002
7

Оба одинаково действительны. int puzzle[]Форма , однако не рекомендуется, то int[] puzzleявляется предпочтительной , в соответствии с кодирующей конвенцией . Смотрите также официальный учебник по массивам Java :

Точно так же вы можете объявить массивы других типов:

byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;

Вы также можете поставить квадратные скобки после имени массива:

float anArrayOfFloats[]; // this form is discouraged

Тем не менее, конвенция препятствует этой форме; скобки обозначают тип массива и должны отображаться с обозначением типа.

Обратите внимание на последний абзац.

Я рекомендую читать официальные руководства Sun / Oracle, а не некоторые сторонние. В противном случае вы рискуете получить плохую практику.

BalusC
источник
6

Это альтернативная форма, которая была заимствована C, на которой основана Java.

Любопытно, что есть три способа определения допустимого mainметода в Java:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)
Богемский
источник
1
С должным уважением, но ответ на этот вопрос - вопрос !!!!! Является ли третья форма, указанная, на самом деле, должна делать что угодно, с тем, что просят в оригинальном посте. Первые два аргумента являются массивами для метода main, хотя третья сущность является переменным аргументом (который не совпадает с массивом). Если вопрос об определении основного метода является вопросом, то можно добавить другую форму, чтобы определить основной метод, например public static void main ( String \u005B \u005D args ), это тоже другой вариант.
Хорошая встреча
2
@nIcEcOw переменной длины параметра, например String... param, является массивом
Bohemian
Простое сомнение возникает, если оба являются массивами, то есть String [] и String ... , then why it is not possible to call a method like say someMethod (1, 2) `если определено someMethodкак someMethod ( int[] numbers ). Массивы требуют, чтобы аргумент был из смежной области памяти, однако varargsсначала он будет создавать массив из предоставленных аргументов. Более того, a varargsможет быть только последним аргументом метода, хотя это не так для массива.
Хорошая встреча
2
@nIcEcOw, но вы можете вызывать varargs с массивом, то есть meth(int... a)можно называть либо либо, meth(1, 2)либо meth(new int[] {1, 2}). Varargs - это синтаксический сахар, который превращает первую версию во вторую. Фактический (байт-код) тип параметра является типом массива. Что касается того, чтобы быть последним, если вы думаете об этом, другого разумного выбора нет.
Богемный
5

Там нет никакой разницы, но Sun рекомендует поставить его рядом с типом, как описано здесь

Андре
источник
3

Наиболее предпочтительный вариант int[] a- потому что int[]это тип, а aэто имя. (ваш второй вариант такой же, как этот, с неуместным пространством)

Функционально между ними нет разницы.

Bozho
источник
3

Спецификация языка Java говорит:

The [] may appear as part of the type at the beginning of the declaration,
or as part of the declarator for a particular variable, or both, as in this
example:

byte[] rowvector, colvector, matrix[];

This declaration is equivalent to:

byte rowvector[], colvector[], matrix[][];

Таким образом, они приведут к абсолютно одинаковому байт-коду.

Kdeveloper
источник
2

В Java это просто разные синтаксические способы сказать одно и то же.

Зак Лютня
источник
2

Они одинаковые. Один является более читабельным (для некоторых), чем другой.

basszero
источник
2

Они полностью эквивалентны. int [] arrayэто предпочтительный стиль. int array[]просто предоставляется в качестве эквивалентного C-совместимого стиля.

Дерек Парк
источник
2

Оба имеют одинаковое значение. Однако наличие этих вариантов также позволяет это:

int[] a, b[];

что так же, как:

int[] a;
int[][] b;

Тем не менее, это ужасный стиль кодирования и никогда не должно быть сделано.

Майкл Боргвардт
источник
Вы хотите сказать, int [] a, b []; b становится многомерным массивом
садананда салам
2

Нет никакой разницы в функциональности между обоими стилями объявления. Оба объявляют массив int.

Но int[] a хранит информацию о типах вместе и является более многословной, поэтому я предпочитаю ее.

СВО
источник
2

Они одинаковы, но между этими утверждениями есть важное различие:

// 1.
int regular, array[];
// 2.
int[] regular, array;

в 1. регулярный - просто целое число, в отличие от 2. где регулярный и массив - это массивы целых чисел.

Поэтому второе утверждение, которое вы имеете, является предпочтительным, поскольку оно более понятно. Первая форма также не рекомендуется в соответствии с этим руководством по Oracle .

Патрик
источник
Спасибо всем! Я пойду со вторым и буду придерживаться его.
Espen
2

Как уже говорилось, нет большой разницы (если вы объявляете только одну переменную на строку).

Обратите внимание, что SonarQube рассматривает ваш второй случай как незначительный запах кода:

Обозначения массива "[]" должны быть на типе, а не на переменной (squid: S1197)

Обозначения массивов всегда должны быть расположены на типе для лучшей читаемости кода. В противном случае разработчики должны смотреть как на тип, так и на имя переменной, чтобы узнать, является ли переменная массивом.

Пример несовместимого кода

int matrix[][];   // Noncompliant
int[] matrix[];   // Noncompliant

Совместимое решение

int[][] matrix;   // Compliant
Роберт Хьюм
источник
1

Да, точно так же. Лично я предпочитаю

int[] integers; 

потому что для любого читающего ваш код сразу становится очевидным, что целые числа - это массив целых чисел, а не

int integers[];

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

Проверьте эту страницу о массивах в Java для более подробных примеров.

Дэвид Уотсон
источник
1

при объявлении ссылки на один массив между ними нет большой разницы. поэтому следующие два объявления одинаковы.

int a[];  // comfortable to programmers who migrated from C/C++
int[] a;  // standard java notation 

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

int a[],b[],c[]; // three array references
int[] a,b,c;  // three array references
Пурначандра
источник
0

Оба в порядке. Я предлагаю выбрать один и придерживаться его. (Я делаю второй)

Альберт
источник
0

Хотя int integers[]решение коренится в языке C (и, таким образом, его можно считать «нормальным» подходом), многие люди находят int[] integersболее логичным, так как оно не позволяет создавать переменные разных типов (например, int и массив) в одном объявлении (в отличие от декларация в стиле C).

Кос
источник