Різниця між масивом int [] та масивом int []


234

Нещодавно я думав про різницю між двома способами визначення масиву:

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

Чи є різниця?

Відповіді:


281

Вони семантично однакові. int array[]Синтаксис був доданий тільки програмістам допомоги C звикає до Java.

int[] array набагато кращий і менш заплутаний.


55
[] - це частина ТИПУ, а не ІМ’Я. Для мене це найбільша різниця.
Андре Шалелла

4
@Andre - і в C [] його частина декларатора, а не специфікатор декларації, звідси і int array[]синтаксис. Також логічно ... певним чином викривленим. :)
Кос

1
C грає в цю маленьку гру :) І я вважаю її чарівною :) Навіть з подібними ... покажчиками. Правильний синтаксис c для покажчиків - int * imAPointer. Дурно і акуратно.
ScarletAmaranth

4
int array[]має більше сенсу для мене. Що ви думаєте про цю декларацію? int[] x, y? Є чи yмасив чи ні? Може, і є, може, і ні. Лише гуру Java можуть впевнено відповісти ....
user1508893

24
У разі int[] x, y, yє масив (тому що []належить до типу), а у випадку int x[], y, y- не масив ( []належить до змінної).
Triang3l

171

Існує одна незначна різниця, якщо вам здається оголосити більше однієї змінної в одній декларації:

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.

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

Без різниці.

Цитування від Sun :

Вони []можуть відображатися як частина типу на початку декларації, або як частина декларатора для певної змінної або обох, як у цьому прикладі:byte[] rowvector, colvector, matrix[];

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


11

Нема різниці між ними; обидва оголошують масив ints. Однак перший є кращим, оскільки він зберігає інформацію про тип в одному місці. Останнє реально підтримується лише на користь програмістів на C / C ++, які переходять на Java.


11

Немає реальної різниці; проте,

double[] items = new double[10];

є кращим, оскільки це чітко вказує, що тип є масивом.


1
подвійні предмети [] дійсно є для програмістів C
Стів Куо,

@Steve, тому, мабуть, тому я продовжую це робити. :-)
Пол Томблін

Може бути зроблений контраргумент, що подвійні елементи [] чітко вказують на тип, а пізніше, що елементи просто так є масивом - все залежить від того, що вам зручно.
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, а не деякі сторонні. Інакше ви ризикуєте закінчитися в навчанні поганих практик.


6

Це альтернативна форма, запозичена у C, на якій базується java.

Як цікавість, є три способи визначення допустимого mainметоду в java:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)

1
З належною повагою, але чи відповідає ця відповідь на питання !!!!! Чи є зазначена третя форма насправді будь-що, з тим, що просять у початковій публікації. Перші два аргументи - це масиви основного методу, хоча третій об'єкт є аргументом змінної (який не є тим самим, як масив). Якщо визначення основного методу - це питання, то можна також додати іншу форму для визначення основного методу, наприклад public static void main ( String \u005B \u005D args ), це теж інший варіант.
NIcE cOw

2
@nIcEcOw параметр varargs, наприклад 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може бути лише остаточним аргументом методу, хоча те ж саме не стосується масиву.
NIcE cOw

2
@nIcEcOw, але ви можете викликати вараги з масивом, тобто meth(int... a)можна викликати як або, meth(1, 2)або meth(new int[] {1, 2}). Вараргс - синтаксичний цукор, який перетворює першу версію на другу. Фактичний (байт-код) тип параметра - це тип масиву. Що стосується того, щоб бути останнім, якщо подумати над цим, іншого іншого розумного вибору немає.
богем

5

Різниці немає, але Sun рекомендує поставити її поруч із типом, як пояснено тут


3

Найбільш переважний варіант int[] a- тому що int[]це тип, іa це ім'я. (ваш другий варіант такий же, як і цей, з пропущеним місцем)

Функціонально між ними немає різниці.


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[][];

Таким чином, вони отримають точно такий же байт-код.




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. regular - це лише int, на відміну від 2. де регулярний і масив є масивами int.

Тому друге твердження, яке ви маєте, є кращим, оскільки воно є більш зрозумілим. Перша форма також не відлякує відповідно до цього підручника з Oracle .


Спасибі всім! Я піду з другим і дотримуюся його.
Еспен

2

Як уже було сказано, різниці немає (якщо ви оголошуєте лише одну змінну на рядок).

Зауважте, що SonarQube трактує ваш другий випадок як незначний запах коду:

Позначення масиву "[]" має бути типу, а не змінної (squid: S1197)

Для кращої читабельності коду завжди повинні розташовуватися позначення типу масиву. В іншому випадку розробники повинні дивитися як на тип, так і на ім'я змінної, щоб знати, чи є змінною масив чи ні.

Приклад невідповідного коду

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

Сумісне рішення

int[][] matrix;   // Compliant

1

Так, точно так само. Особисто я віддаю перевагу

int[] integers; 

тому що це робить очевидним для кожного, хто читає ваш код, що цілі числа - це масив int, на відміну від

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 та масив) в одному оголошенні (на відміну від декларація у стилі С).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.