Diferencia entre la matriz int [] y la matriz int []

234

Recientemente he estado pensando en la diferencia entre las dos formas de definir una matriz:

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

¿Hay una diferencia?

mslot
fuente

Respuestas:

282

Son semánticamente idénticos. La int array[]sintaxis solo se agregó para ayudar a los programadores de C a acostumbrarse a Java.

int[] array es preferible y menos confuso.

skaffman
fuente
55
El [] es parte del TIPO, no del NOMBRE. Para mí, esa es la mayor diferencia.
André Chalella
44
@Andre - y en C, el [] es parte del declarador, no el especificador de la declaración, de ahí la int array[]sintaxis. También lógico ... de alguna manera retorcida. :)
Kos
1
C juega este pequeño juego :) Y lo encuentro encantador :) Incluso con punteros similares. La sintaxis 'correcta' de c para punteros es int * imAPointer. Es tonto y ordenado.
ScarletAmaranth
44
int array[]Tiene más sentido para mí. ¿Qué opinas de esta declaración? int[] x, y? ¿Es yuna matriz o no? Tal vez lo sea, tal vez no lo sea. Solo los gurús de Java pueden responder con confianza ...
user1508893
24
En el caso de int[] x, y, yes una matriz (porque []pertenece al tipo), y en el caso de int x[], y, yno es una matriz ( []pertenece a la variable).
Triang3l
172

Hay una pequeña diferencia, si declara más de una variable en la misma declaración:

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

Tenga en cuenta que este es un mal estilo de codificación, aunque el compilador seguramente detectará su error en el momento en que intente usarlo d.

Adam Rosenfield
fuente
52

No hay diferencia.

Prefiero que el type[] nameformato en está claro que la variable es una matriz (menos mirar alrededor para descubrir qué es).

EDITAR:

Oh, espera, hay una diferencia (lo olvidé porque nunca declaro más de una variable a la vez):

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

No, estos son lo mismo. sin embargo

byte[] rowvector, colvector, matrix[];

es equivalente a:

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

Tomado de la especificación Java . Eso significa que

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

son diferentes. No recomendaría ninguna de estas declaraciones múltiples. Más fácil de leer sería (probablemente):

int[] a;
int[] b;
Ishtar
fuente
3
Sin embargo, es una buena práctica usar una declaración por identificador en lugar de declarar múltiples identificadores en una línea.
rsp
@rsp - Totalmente de acuerdo, editó una mejor práctica en. Aún así, es sugerente lo que es una buena práctica.
Ishtar
25

De la sección 10.2 de la Especificación del lenguaje Java :

El [] puede aparecer como parte del tipo al comienzo de la declaración, o como parte del declarador para una variable particular, o ambas, como en este ejemplo:

 byte[] rowvector, colvector, matrix[];

Esta declaración es equivalente a:

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

Personalmente, casi todo el código Java que he visto utiliza la primera forma, lo que tiene más sentido al mantener toda la información de tipo sobre la variable en un solo lugar. Desearía que se rechazara la segunda forma, para ser honesto ... pero así es la vida ...

Afortunadamente no creo que he nunca visto este código (válida):

String[] rectangular[] = new String[10][10];
Jon Skeet
fuente
Gracias, me estaba rascando la cabeza por esto. Por extraño que parezca, cuando busqué en Google el título de la pregunta no encontré nada ...
Yoav
3
+1 Estoy de acuerdo en no permitir la segunda forma. +1 también porque no me di cuenta de que podías mezclar 'n' match como int[] a[];- eso nunca será claro ;-)
Bohemian
13

Ninguna diferencia.

Citando de Sun :

El []pueden aparecer como parte del tipo en el comienzo de la declaración, o como parte de la declarador para una variable en particular, o ambos, como en este ejemplo:byte[] rowvector, colvector, matrix[];

Esta declaración es equivalente a: byte rowvector[], colvector[], matrix[][];

Yuval Adam
fuente
11

No hay ninguna diferencia entre los dos; ambos declaran una matriz de ints. Sin embargo, se prefiere el primero ya que mantiene la información de tipo en un solo lugar. Este último solo es realmente compatible para el beneficio de los programadores de C / C ++ que se trasladan a Java.

Luke Woodward
fuente
11

No hay diferencia real; sin embargo,

double[] items = new double[10];

se prefiere ya que indica claramente que el tipo es una matriz.

Aaron Maenpaa
fuente
1
los ítems dobles [] están realmente ahí para los programadores de C
Steve Kuo
@ Steve, por eso sigo haciéndolo de esa manera. :-)
Paul Tomblin
Se puede hacer un contraargumento en el que los elementos dobles [] indiquen claramente el tipo y, más tarde, los elementos resulten ser una matriz; todo depende de con qué se sienta cómodo.
MetroidFan2002
7

Ambos son igualmente válidos. El int puzzle[]sin embargo forma se desaconseja, el int[] puzzlese prefiere de acuerdo con las convenciones de codificación . Consulte también el tutorial oficial de matrices Java :

Del mismo modo, puede declarar matrices de otros tipos:

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

También puede colocar los corchetes después del nombre de la matriz:

float anArrayOfFloats[]; // this form is discouraged

Sin embargo, la convención desalienta esta forma; los corchetes identifican el tipo de matriz y deben aparecer con la designación de tipo.

Tenga en cuenta el último párrafo.

Recomiendo leer los tutoriales oficiales de Sun / Oracle en lugar de algunos de terceros. De lo contrario, correría el riesgo de aprender malas prácticas.

BalusC
fuente
6

Es una forma alternativa, que se tomó prestada C, sobre la cual se basa Java.

Como curiosidad, hay tres formas de definir un mainmétodo válido en Java:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)
Bohemio
fuente
1
¡Con el debido respeto, pero esta respuesta es la pregunta! Es la tercera forma, especificada, realmente tiene que hacer algo, con lo que se pide en la publicación original. Los primeros dos argumentos son matrices del método principal, aunque la tercera entidad es un argumento variable (que no es lo mismo que una matriz). Si la definición del método principal es la pregunta, entonces también se puede agregar otro formulario para definir un método principal, como public static void main ( String \u005B \u005D args ), esta es otra variante también.
VACA PRONTO
2
@nIcEcOw un parámetro varargs, por ejemplo String... param, es una matriz
Bohemian
Solo surge una simple duda, si ambas son matrices, es decir, String [] y String ... , then why it is not possible to call a method like say someMethod (1, 2) `si se define someMethodcomo someMethod ( int[] numbers ). Las matrices exigen que el argumento, debe ser de una ubicación de memoria contigua, sin embargo varargs, primero formará una matriz de los argumentos suministrados. Además, a varargssolo puede ser el argumento final de un método, aunque lo mismo no es cierto para una matriz.
VACA PRÁCTICA
2
@nIcEcOw pero puede llamar a un varargs con una matriz, es decir, meth(int... a)puede llamarse como meth(1, 2)o meth(new int[] {1, 2}). Varargs es azúcar sintáctico que convierte la primera versión en la segunda versión. El tipo real (bytecode) del parámetro es un tipo de matriz. En cuanto a tener que ser el último, si lo piensas bien, no hay otra opción sensata.
Bohemio
5

No hay diferencia, pero Sun recomienda ponerlo al lado del tipo como se explica aquí

André
fuente
3

La opción más preferida es int[] aporque int[]es el tipo y ael nombre. (su segunda opción es la misma que esta, con espacio fuera de lugar)

Funcionalmente no hay diferencia entre ellos.

Bozho
fuente
3

La especificación del lenguaje Java dice:

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

Por lo tanto, darán como resultado exactamente el mismo código de bytes.

Kdeveloper
fuente
2

En Java, estos son simplemente métodos sintácticos diferentes para decir lo mismo.

Zach Lute
fuente
2

Son lo mismo Uno es más legible (para algunos) que el otro.

basszero
fuente
2

Son completamente equivalentes. int [] arrayEs el estilo preferido. int array[]solo se proporciona como un estilo equivalente compatible con C.

Derek Park
fuente
2

Ambos tienen el mismo significado. Sin embargo, la existencia de estas variantes también permite esto:

int[] a, b[];

que es lo mismo que:

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

Sin embargo, este es un estilo de codificación horrible y nunca debe hacerse.

Michael Borgwardt
fuente
quieres decir, int [] a, b []; b se convierte en una matriz multidimensional
sadananda salam 02 de
2

No hay diferencia en la funcionalidad entre ambos estilos de declaración. Ambos declaran matriz de int.

Pero int[] a mantiene la información de tipo unida y es más detallada, así que la prefiero.

YoK
fuente
2

Son lo mismo, pero hay una diferencia importante entre estas declaraciones:

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

en 1. regular es solo un int, a diferencia de 2. donde regular y array son matrices de int.

Por lo tanto, se prefiere la segunda declaración que tiene, ya que es más clara. La primera forma también se desaconseja de acuerdo con este tutorial sobre Oracle .

Patricio
fuente
Gracias a todos! Iré con el segundo y me quedaré con él.
Espen
2

Como ya se dijo, no hay mucha diferencia (si declara solo una variable por línea).

Tenga en cuenta que SonarQube trata su segundo caso como un olor de código menor :

Los designadores de matriz "[]" deben estar en el tipo, no en la variable (calamar: S1197)

Los designadores de matriz siempre deben ubicarse en el tipo para una mejor legibilidad del código. De lo contrario, los desarrolladores deben mirar tanto el tipo como el nombre de la variable para saber si una variable es una matriz o no.

Ejemplo de código no conforme

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

Solución conforme

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

Sí, exactamente lo mismo. Personalmente prefiero

int[] integers; 

porque hace que sea inmediatamente obvio para cualquiera que lea su código que los enteros son una matriz de int, en lugar de

int integers[];

lo que no lo hace tan obvio, especialmente si tiene varias declaraciones en una línea. Pero, de nuevo, son equivalentes, por lo que se reduce a la preferencia personal.

Consulte esta página sobre matrices en Java para obtener ejemplos más detallados.

David Watson
fuente
1

Al declarar una referencia de matriz única, no hay mucha diferencia entre ellas. entonces las siguientes dos declaraciones son iguales.

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

Al declarar múltiples referencias de matriz, podemos encontrar la diferencia entre ellas. Las siguientes dos afirmaciones significan lo mismo. de hecho, depende del programador cuál se sigue. pero se recomienda la notación java estándar.

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

Ambos estan bien. Sugiero elegir uno y seguir con él. (Hago el segundo)

Albert
fuente
0

Si bien la int integers[]solución se basa en el lenguaje C (y, por lo tanto, puede considerarse el enfoque "normal"), muchas personas encuentran int[] integersmás lógica, ya que no permite crear variables de diferentes tipos (es decir, un int y una matriz) en una declaración (en oposición a la declaración de estilo C).

Kos
fuente