Unterschied zwischen int [] Array und int Array []

234

Ich habe kürzlich über den Unterschied zwischen den beiden Arten der Definition eines Arrays nachgedacht:

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

Ist da ein Unterschied?

mslot
quelle

Antworten:

281

Sie sind semantisch identisch. Die int array[]Syntax wurde nur hinzugefügt, um C-Programmierern zu helfen, sich an Java zu gewöhnen.

int[] array ist viel vorzuziehen und weniger verwirrend.

Skaffman
quelle
55
Das [] ist Teil des TYPES, nicht des NAME. Für mich ist das der größte Unterschied.
André Chalella
4
@Andre - und in C das [] sein Teil des Deklarators, nicht der Deklarationsspezifizierer, daher die int array[]Syntax. Auch logisch ... auf verdrehte Weise. :)
Kos
1
C spielt dieses kleine Spiel :) Und ich finde es charmant :) Auch mit ähnlichen ... Zeigern. Die 'richtige' c-Syntax für Zeiger lautet int * imAPointer. Es ist albern und ordentlich.
ScarletAmaranth
4
int array[]macht für mich mehr Sinn. Was halten Sie von dieser Erklärung? int[] x, y? Ist yein Array oder nicht? Vielleicht ist es das, vielleicht ist es das nicht. Nur Javas Gurus können mit Zuversicht antworten ....
user1508893
24
Im Fall von int[] x, y, yist ein Array (wegen []der Art angehört), und im Fall eines int x[], y, ykein Array ( []gehört zur Variable).
Triang3l
171

Es gibt einen kleinen Unterschied, wenn Sie mehr als eine Variable in derselben Deklaration deklarieren:

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

Beachten Sie, dass dies ein schlechter Codierungsstil ist, obwohl der Compiler Ihren Fehler mit ziemlicher Sicherheit abfängt, sobald Sie versuchen, ihn zu verwenden d.

Adam Rosenfield
quelle
52

Es gibt keinen Unterschied.

Ich bevorzuge das type[] nameFormat bei ist klar, dass die Variable ein Array ist (weniger umschauen, um herauszufinden, was es ist).

BEARBEITEN:

Oh, warte, es gibt einen Unterschied (ich habe vergessen, weil ich nie mehr als eine Variable gleichzeitig deklariere):

int[] foo, bar; // both are arrays
int foo[], bar; // foo is an array, bar is an int.
TofuBeer
quelle
27

Nein, das sind die gleichen. jedoch

byte[] rowvector, colvector, matrix[];

ist äquivalent zu:

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

Entnommen aus der Java-Spezifikation . Das bedeutet, dass

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

sind anders. Ich würde keine dieser mehrfachen Erklärungen empfehlen. Am einfachsten zu lesen wäre (wahrscheinlich):

int[] a;
int[] b;
Ishtar
quelle
3
Es wird jedoch empfohlen, eine Deklaration pro Bezeichner zu verwenden, anstatt mehrere Bezeichner in einer Zeile zu deklarieren.
rsp
@rsp - Stimme voll und ganz zu, bearbeitete eine Best Practice in. Trotzdem ist es naheliegend, was eine gute Praxis ist.
Ishtar
25

Aus Abschnitt 10.2 der Java-Sprachspezifikation :

Das [] kann als Teil des Typs am Anfang der Deklaration oder als Teil des Deklarators für eine bestimmte Variable oder für beide wie in diesem Beispiel angezeigt werden:

 byte[] rowvector, colvector, matrix[];

Diese Erklärung entspricht:

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

Persönlich verwendet fast der gesamte Java-Code, den ich je gesehen habe, das erste Formular. Dies ist sinnvoller, wenn alle Typinformationen über die Variable an einem Ort aufbewahrt werden. Ich wünschte, die zweite Form wäre nicht erlaubt, um ehrlich zu sein ... aber so ist das Leben ...

Zum Glück glaube ich nicht, dass ich diesen (gültigen) Code jemals gesehen habe :

String[] rectangular[] = new String[10][10];
Jon Skeet
quelle
Danke, ich habe mir den Kopf darüber gekratzt. Seltsamerweise fand ich beim Googeln des Titels der Frage nichts ...
Yoav
3
+1 Ich bin damit einverstanden, das zweite Formular nicht zuzulassen. +1 auch, weil ich nicht wusste, dass man 'n' Match wie mischen kann int[] a[];- das wird nie unklar sein ;-)
Bohemian
13

Kein Unterschied.

Zitat aus der Sonne :

Die []können als Teil des Typs am Anfang der Deklaration oder als Teil des Deklarators für eine bestimmte Variable oder für beide wie in diesem Beispiel angezeigt werden:byte[] rowvector, colvector, matrix[];

Diese Erklärung entspricht: byte rowvector[], colvector[], matrix[][];

Yuval Adam
quelle
11

Es gibt keinen Unterschied zwischen den beiden; beide deklarieren ein Array von ints. Ersteres wird jedoch bevorzugt, da alle Typinformationen an einem Ort gespeichert werden. Letzteres wird nur für C / C ++ - Programmierer, die auf Java umsteigen, wirklich unterstützt.

Luke Woodward
quelle
11

Es gibt keinen wirklichen Unterschied; jedoch,

double[] items = new double[10];

wird bevorzugt, da dies eindeutig anzeigt, dass der Typ ein Array ist.

Aaron Maenpaa
quelle
1
double items [] ist wirklich für die C-Programmierer da
Steve Kuo
@Steve, das muss der Grund sein, warum ich es so mache. :-)
Paul Tomblin
Es kann ein Gegenargument angeführt werden, dass doppelte Elemente [] den Typ klar angeben und später, dass Elemente zufällig ein Array sind - alles hängt davon ab, mit was Sie vertraut sind.
MetroidFan2002
7

Beide sind gleichermaßen gültig. Von der int puzzle[]Form wird jedoch abgeraten, die int[] puzzlegemäß den Kodierungskonventionen bevorzugt wird . Siehe auch das offizielle Java-Arrays-Tutorial :

Ebenso können Sie Arrays anderer Typen deklarieren:

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

Sie können die eckigen Klammern auch nach dem Namen des Arrays setzen:

float anArrayOfFloats[]; // this form is discouraged

Die Konvention rät jedoch von dieser Form ab. Die Klammern geben den Array-Typ an und sollten mit der Typbezeichnung angezeigt werden.

Beachten Sie den letzten Absatz.

Ich empfehle, die offiziellen Sun / Oracle-Tutorials zu lesen, anstatt einige von Drittanbietern. Sie würden sonst riskieren, schlechte Praktiken zu lernen.

BalusC
quelle
6

Es ist eine alternative Form, die entlehnt wurde Cund auf der Java basiert.

Aus Neugier gibt es drei Möglichkeiten, eine gültige mainMethode in Java zu definieren :

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)
Böhmisch
quelle
1
Mit gebührendem Respekt, aber ist diese Antwort die Frage !!!!! Ist die dritte Form, angegeben, hat eigentlich alles zu tun, mit dem, was im ursprünglichen Beitrag gefragt wird. Die ersten beiden Argumente sind Arrays für die Hauptmethode, obwohl die dritte Entität ein variables Argument ist (das nicht mit einem Array identisch ist). Wenn die Definition der Hauptmethode die Frage ist, kann man ein anderes Formular hinzufügen, um auch eine Hauptmethode zu definieren. public static void main ( String \u005B \u005D args )Dies ist auch eine andere Variante.
Eis
2
@nIcEcOw ein varargs Parameter, zum Beispiel String... param, ist ein Array
Böhmer
Nur ein einfacher Zweifel entsteht, wenn beide Arrays sind, dh String [] und String ... , then why it is not possible to call a method like say someMethod (1, 2) `wenn man definiert someMethodals someMethod ( int[] numbers ). Arrays verlangen, dass das Argument aus einem zusammenhängenden Speicherort stammt varargs, machen jedoch zuerst ein Array aus den angegebenen Argumenten. Darüber hinaus varargskann a nur das letzte Argument einer Methode sein, obwohl dies für ein Array nicht gilt.
Eis
2
@nIcEcOw, aber Sie können ein varargs mit einem Array aufrufen, dh meth(int... a)als entweder meth(1, 2)oder meth(new int[] {1, 2}). Varargs ist syntaktischer Zucker, der die erste Version in die zweite Version verwandelt. Der tatsächliche (Bytecode-) Typ des Parameters ist ein Array-Typ. Wenn Sie darüber nachdenken, dass Sie der Letzte sein müssen, gibt es keine andere vernünftige Wahl.
Böhmisch
5

Es gibt keinen Unterschied, aber Sun empfiehlt, ihn wie hier beschrieben neben den Typ zu setzen

André
quelle
3

Die am meisten bevorzugte Option ist int[] a- weil int[]der Typ und ader Name ist. (Ihre zweite Option ist dieselbe wie diese, mit falschem Platz)

Funktionell gibt es keinen Unterschied zwischen ihnen.

Bozho
quelle
3

Die Java-Sprachspezifikation lautet:

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

Somit ergeben sie genau den gleichen Bytecode.

Entwickler
quelle
2

In Java sind dies einfach verschiedene syntaktische Methoden, um dasselbe zu sagen.

Zach Lute
quelle
2

Sie sind die gleichen. Einer ist (für einige) besser lesbar als der andere.

Basszero
quelle
2

Sie sind völlig gleichwertig. int [] arrayist der bevorzugte Stil. int array[]wird nur als äquivalenter, C-kompatibler Stil bereitgestellt.

Derek Park
quelle
2

Beide haben die gleiche Bedeutung. Das Vorhandensein dieser Varianten ermöglicht jedoch auch Folgendes:

int[] a, b[];

Das ist das gleiche wie:

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

Dies ist jedoch ein schrecklicher Codierungsstil und sollte niemals durchgeführt werden.

Michael Borgwardt
quelle
du willst sagen, int [] a, b []; b wird ein mehrdimensionales Array
Sadananda Salam
2

Es gibt keinen Unterschied in der Funktionalität zwischen beiden Deklarationsstilen. Beide deklarieren das Array von int.

Aber int[] a hält Typinformationen zusammen und ist ausführlicher, also bevorzuge ich es.

YoK
quelle
2

Sie sind gleich, aber es gibt einen wichtigen Unterschied zwischen diesen Aussagen:

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

in 1. regulär ist nur ein int, im Gegensatz zu 2. wo sowohl regulär als auch Array Arrays von int sind.

Die zweite Aussage, die Sie haben, wird daher bevorzugt, da sie klarer ist. Das erste Formular wird gemäß diesem Tutorial zu Oracle ebenfalls nicht empfohlen .

Patrick
quelle
Vielen Dank an alle! Ich werde mit dem zweiten gehen und dabei bleiben.
Espen
2

Wie bereits erwähnt, gibt es keinen großen Unterschied (wenn Sie nur eine Variable pro Zeile deklarieren).

Beachten Sie, dass SonarQube Ihren zweiten Fall als geringfügigen Codegeruch behandelt :

Array-Bezeichner "[]" sollten sich auf den Typ beziehen, nicht auf die Variable (Tintenfisch: S1197)

Array-Bezeichner sollten sich zur besseren Lesbarkeit des Codes immer auf dem Typ befinden. Andernfalls müssen Entwickler sowohl den Typ als auch den Variablennamen überprüfen, um festzustellen, ob eine Variable ein Array ist oder nicht.

Beispiel für nicht konformen Code

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

Konforme Lösung

int[][] matrix;   // Compliant
Robert Hume
quelle
1

Ja, genau das gleiche. Ich persönlich bevorzuge

int[] integers; 

weil es jedem, der Ihren Code liest, sofort klar macht, dass Ganzzahlen ein Array von Ints sind, im Gegensatz zu

int integers[];

Das macht es nicht so offensichtlich, besonders wenn Sie mehrere Deklarationen in einer Zeile haben. Aber auch hier sind sie gleichwertig, so dass es auf die persönlichen Vorlieben ankommt.

Auf dieser Seite zu Arrays in Java finden Sie ausführlichere Beispiele.

David Watson
quelle
1

Wenn Sie eine einzelne Array-Referenz deklarieren, gibt es keinen großen Unterschied zwischen ihnen. Die folgenden beiden Erklärungen sind also gleich.

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

Wenn wir mehrere Array-Referenzen deklarieren, können wir einen Unterschied zwischen ihnen feststellen. Die folgenden zwei Aussagen bedeuten dasselbe. in der Tat ist es Sache des Programmierers, dem man folgt. Es wird jedoch die Standard-Java-Notation empfohlen.

int a[],b[],c[]; // three array references
int[] a,b,c;  // three array references
PoornaChandra
quelle
0

Beide sind ok. Ich schlage vor, einen auszuwählen und dabei zu bleiben. (Ich mache den zweiten)

Albert
quelle
0

Während die int integers[]Lösung in der C-Sprache verwurzelt ist (und daher als "normaler" Ansatz angesehen werden kann), finden es viele Menschen int[] integerslogischer, Variablen unterschiedlichen Typs (dh ein int und ein Array) in einer Deklaration (im Gegensatz zu) zu erstellen die C-Deklaration).

Kos
quelle