Differenza tra int [] array e int array []


234

Di recente ho pensato alla differenza tra i due modi di definire un array:

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

C'è una differenza?

Risposte:


282

Sono semanticamente identici. La int array[]sintassi è stata aggiunta solo per aiutare i programmatori C ad abituarsi a Java.

int[] array è molto preferibile e meno confuso.


55
Il [] fa parte del TIPO, non del NOME. Per me, questa è la differenza più grande.
André Chalella,

4
@Andre - e in C, [] fa parte del dichiaratore, non lo specificatore di dichiarazione, quindi la int array[]sintassi. Anche logico ... in qualche modo contorto. :)
Kos

1
C gioca a questo piccolo gioco :) E lo trovo affascinante :) Anche con puntatori simili ... La sintassi c 'corretta' per i puntatori è int * imAPointer. È sciocco e pulito.
ScarletAmaranth,

4
int array[]ha più senso per me. Cosa ne pensi di questa dichiarazione? int[] x, y? È yun array o no? Forse lo è, forse no. Solo i guru di Java possono rispondere con fiducia ....
user1508893

24
In caso di int[] x, y, yè un array (perché []appartiene al tipo), e in caso di int x[], y, ynon è un array ( []appartiene alla variabile).
Triang3l

172

C'è una leggera differenza, se ti capita di dichiarare più di una variabile nella stessa dichiarazione:

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

Si noti che questo è un cattivo stile di codifica, sebbene il compilatore quasi sicuramente rileverà il tuo errore nel momento in cui proverai a usarlo d.


52

Non c'è differenza.

Preferisco il type[] name formato sia chiaro che la variabile è un array (meno guardandosi intorno per scoprire di cosa si tratta).

MODIFICARE:

Oh aspetta c'è una differenza (ho dimenticato perché non dichiaro mai più di una variabile alla volta):

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

27

No, sono uguali. però

byte[] rowvector, colvector, matrix[];

è equivalente a:

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

Tratto dalle specifiche Java . Ciò significa che

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

sono diversi. Non consiglierei nessuna di queste dichiarazioni multiple. Il più facile da leggere sarebbe (probabilmente):

int[] a;
int[] b;

3
È buona norma tuttavia utilizzare una dichiarazione per identificatore anziché dichiarare più identificatori in una riga.
rsp

@rsp - Sono totalmente d'accordo, ho modificato una best practice in. Tuttavia, è suggestivo ciò che è buona pratica.
Ishtar,

25

Dalla sezione 10.2 della specifica del linguaggio Java :

[] Può apparire come parte del tipo all'inizio della dichiarazione o come parte del dichiaratore per una particolare variabile o entrambi, come in questo esempio:

 byte[] rowvector, colvector, matrix[];

Questa dichiarazione equivale a:

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

Personalmente quasi tutto il codice Java che abbia mai visto utilizza il primo modulo, il che ha più senso mantenendo tutte le informazioni sul tipo della variabile in un unico posto. Vorrei che la seconda forma fosse vietata, a dire il vero ... ma tale è la vita ...

Fortunatamente non credo di aver mai visto questo codice (valido):

String[] rectangular[] = new String[10][10];

Grazie, mi stavo grattando la testa. Stranamente, quando ho cercato su Google il titolo della domanda non ho trovato nulla ...
Yoav,

3
+1 Accetto di non consentire il secondo modulo. Anche +1 perché non mi ero reso conto che potevi mescolare 'n' match come int[] a[];- non sarà mai poco chiaro ;-)
Boemo


13

Nessuna differenza.

Citando da Sun :

Il []simbolo può apparire come parte del tipo all'inizio della dichiarazione o come parte del dichiaratore per una particolare variabile o entrambi, come in questo esempio:byte[] rowvector, colvector, matrix[];

Questa dichiarazione equivale a: byte rowvector[], colvector[], matrix[][];


11

Non c'è alcuna differenza tra i due; entrambi dichiarano un array di ints. Tuttavia, il primo è preferito poiché conserva le informazioni sul tipo in un unico posto. Quest'ultimo è davvero supportato solo a vantaggio dei programmatori C / C ++ che si spostano su Java.


11

Non c'è vera differenza; però,

double[] items = new double[10];

è preferito poiché indica chiaramente che il tipo è un array.


1
double items [] è davvero lì per i programmatori C
Steve Kuo,

@Steve, deve essere questo il motivo per cui continuo a farlo in quel modo. :-)
Paul Tomblin,

È possibile affermare che gli oggetti doppi [] indicano chiaramente il tipo e in seguito che gli articoli sembrano essere un array - tutto dipende da cosa ti senti a tuo agio.
MetroidFan2002

7

Entrambi sono ugualmente validi. La int puzzle[]forma è comunque scoraggiata, int[] puzzleè preferita secondo le convenzioni di codifica . Vedi anche il tutorial ufficiale sulle matrici Java :

Allo stesso modo, puoi dichiarare matrici di altri tipi:

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

Puoi anche posizionare le parentesi quadre dopo il nome dell'array:

float anArrayOfFloats[]; // this form is discouraged

Tuttavia, la convenzione scoraggia questa forma; le parentesi identificano il tipo di array e devono apparire con la designazione del tipo.

Nota l'ultimo paragrafo.

Consiglio di leggere i tutorial ufficiali Sun / Oracle piuttosto che quelli di terze parti. Altrimenti rischieresti di imparare cattive pratiche.


6

È una forma alternativa, da cui è stata presa in prestito C, su cui si basa Java.

Come curiosità, ci sono tre modi per definire un mainmetodo valido in java:

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

1
Con il dovuto rispetto, ma questa risposta è la domanda !!!!! È il terzo modulo, specificato, in realtà deve fare qualsiasi cosa, con ciò che viene chiesto nel post originale. I primi due argomenti sono array per il metodo principale, sebbene la terza entità sia un argomento variabile (che non è lo stesso di un array). Se la definizione del metodo principale è la domanda, allora si può aggiungere un altro modulo per definire anche un metodo principale, come public static void main ( String \u005B \u005D args ), anche questa è un'altra variante.
nIcO circa

2
@nIcEcOw un parametro varargs, ad esempio String... param, è un array
Bohemian

Sorge solo un semplice dubbio, se entrambi sono array, cioè String [] e String ... , then why it is not possible to call a method like say someMethod (1, 2) `se uno sta definendo someMethodcome someMethod ( int[] numbers ). Le matrici richiedono che l'argomento, invece, debba trovarsi in una posizione di memoria contigua, ma per prima cosa varargscreerà una matrice dagli argomenti forniti. Inoltre, a varargspuò essere solo l'argomento finale di un metodo, sebbene lo stesso non sia vero per un array.
nIcO circa

2
@nIcEcOw ma puoi chiamare un varargs con un array, cioè meth(int... a)può essere chiamato come meth(1, 2)o meth(new int[] {1, 2}). Varargs è lo zucchero sintattico che trasforma la prima versione nella seconda versione. Il tipo effettivo (bytecode) del parametro è un tipo di array. Per quanto riguarda il fatto di essere l'ultimo, se ci pensate, non c'è altra scelta sana.
Boemia

5

Non c'è alcuna differenza, ma Sun consiglia di metterlo accanto al tipo come spiegato qui


3

L'opzione più preferita è int[] a- poiché int[]è il tipo ea è il nome. (la tua seconda opzione è la stessa di questa, con spazio fuori posto)

Funzionalmente non c'è differenza tra loro.


3

Le specifiche del linguaggio Java dicono:

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

Pertanto si tradurranno esattamente nello stesso codice byte.


2

In Java, questi sono semplicemente diversi metodi sintattici per dire la stessa cosa.


2

Sono uguali Uno è più leggibile (per alcuni) dell'altro.


2

Sono completamente equivalenti. int [] arrayè lo stile preferito. int array[]viene fornito solo come stile equivalente compatibile con C.


2

Entrambi hanno lo stesso significato. Tuttavia, l'esistenza di queste varianti consente anche questo:

int[] a, b[];

che è lo stesso di:

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

Tuttavia, questo è uno stile di programmazione orribile e non dovrebbe mai essere fatto.


intendi dire, int [] a, b []; b diventa un array multidimensionale
sadananda salam,

2

Non c'è differenza nella funzionalità tra entrambi gli stili di dichiarazione. Entrambi dichiarano array di int.

Ma int[] a tiene insieme le informazioni sul tipo ed è più dettagliato quindi le preferisco.


2

Sono gli stessi, ma c'è una differenza importante tra queste affermazioni:

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

in 1. regular è solo un int, al contrario di 2. dove sia regular che array sono array di int.

La seconda affermazione che hai è quindi preferita, poiché è più chiara. Il primo modulo è anche scoraggiato secondo questo tutorial su Oracle .


Grazie a tutti! Vado con il secondo e rimango fedele.
Espen,

2

Come già detto, non c'è molta differenza (se si dichiara solo una variabile per riga).

Si noti che SonarQube considera il secondo caso come un odore di codice minore :

I designatori di array "[]" dovrebbero essere sul tipo, non sulla variabile (calamari: S1197)

I designatori di array devono sempre trovarsi sul tipo per una migliore leggibilità del codice. Altrimenti, gli sviluppatori devono esaminare sia il tipo che il nome della variabile per sapere se una variabile è o meno un array.

Esempio di codice non conforme

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

Soluzione conforme

int[][] matrix;   // Compliant

1

Sì, esattamente lo stesso. Personalmente, preferisco

int[] integers; 

perché rende immediatamente ovvio a chiunque legga il tuo codice che numeri interi sono un array di int, al contrario di

int integers[];

il che non rende tutto così ovvio, in particolare se hai più dichiarazioni in una riga. Ma, di nuovo, sono equivalenti, quindi dipende dalle preferenze personali.

Dai un'occhiata a questa pagina sugli array in Java per esempi più approfonditi.


1

quando si dichiara un riferimento ad un singolo array, non c'è molta differenza tra loro. quindi le seguenti due dichiarazioni sono uguali.

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

quando dichiariamo più riferimenti di array, possiamo trovare delle differenze tra di loro. le seguenti due affermazioni significano lo stesso. in effetti, spetta al programmatore quale si segue. ma si consiglia la notazione java standard.

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

0

Entrambi sono ok. Suggerisco di sceglierne uno e attenersi ad esso. (Faccio il secondo)


0

Mentre la int integers[]soluzione affonda nel linguaggio C (e può quindi essere considerata l'approccio "normale"), molte persone trovano int[] integerspiù logico in quanto non consente di creare variabili di diversi tipi (cioè un int e un array) in una dichiarazione (al contrario di la dichiarazione in stile C).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.