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?

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.


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.


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.

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;

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

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


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.


11

Es gibt keinen wirklichen Unterschied; jedoch,

double[] items = new double[10];

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


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.


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)

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


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.


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.


2

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


2

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


2

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


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.


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.


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 .


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

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.


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

0

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


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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.