Diferença entre int [] array e int array []

234

Recentemente, estive pensando sobre a diferença entre as duas maneiras de definir uma matriz:

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

Existe alguma diferença?

mslot
fonte

Respostas:

282

Eles são semanticamente idênticos. A int array[]sintaxe foi adicionada apenas para ajudar os programadores C a se acostumarem ao java.

int[] array é muito preferível e menos confuso.

skaffman
fonte
55
O [] faz parte do TYPE, não do NAME. Para mim, essa é a maior diferença.
André Chalella 24/09/08
4
@Andre - e em C, a [] sua parte do declarador, não o especificador de declaração, portanto a int array[]sintaxe. Também lógico ... de alguma maneira distorcida. :)
Kos
1
C joga esse joguinho :) E acho charmoso :) Mesmo com ... ponteiros. A sintaxe c 'correta' para ponteiros é int * imAPointer. É bobo e arrumado.
ScarletAmaranth
4
int array[]faz mais sentido para mim. O que você acha dessa declaração? int[] x, y? É yuma matriz ou não? Talvez seja, talvez não seja. Gurus única do Java pode responder com confiança ....
user1508893
24
No caso de int[] x, y, yé uma matriz (porque []pertence ao tipo) e, no caso de int x[], y, ynão é uma matriz ( []pertence à variável).
precisa saber é o seguinte
172

Há uma pequena diferença, se você declarar mais de uma variável na mesma declaração:

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

Observe que este é um estilo de codificação ruim, embora o compilador quase certamente capte seu erro no momento em que você tentar usar d.

Adam Rosenfield
fonte
52

Não há diferença.

Eu prefiro o type[] nameformato em é claro que a variável é uma matriz (menos olhando ao redor para descobrir o que é).

EDITAR:

Oh, espere, há uma diferença (eu esqueci porque nunca declaro mais de uma variável por vez):

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

Não, são os mesmos. Contudo

byte[] rowvector, colvector, matrix[];

é equivalente a:

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

Retirado da especificação Java . Isso significa que

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

são diferentes. Eu não recomendaria nenhuma dessas múltiplas declarações. A leitura mais fácil (provavelmente) seria:

int[] a;
int[] b;
Ishtar
fonte
3
No entanto, é uma boa prática usar uma declaração por identificador em vez de declarar vários identificadores em uma linha.
Rsp2
@rsp - Concordo totalmente, editei uma prática recomendada. Ainda assim, é sugestivo o que é uma boa prática.
Ishtar
25

Na seção 10.2 da especificação da linguagem Java :

O [] pode aparecer como parte do tipo no início da declaração, ou como parte do declarador para uma variável específica, ou ambas, como neste exemplo:

 byte[] rowvector, colvector, matrix[];

Esta declaração é equivalente a:

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

Pessoalmente, quase todo o código Java que eu já vi usa a primeira forma, o que faz mais sentido, mantendo todas as informações de tipo sobre a variável em um só lugar. Eu gostaria que a segunda forma não fosse permitida, para ser honesto ... mas tal é a vida ...

Felizmente, acho que nunca vi esse código (válido):

String[] rectangular[] = new String[10][10];
Jon Skeet
fonte
Obrigado, eu estava coçando a cabeça por causa disso. Estranhamente, ao pesquisar o título da pergunta, não encontrei nada ...
Yoav
3
+1 Concordo em não permitir a segunda forma. +1 também porque eu não sabia que você poderia misturar 'n' match como int[] a[];- isso nunca ficará claro ;-)
Bohemian
13

Não faz diferença.

Citações da Sun :

O []podem aparecer como parte do tipo no início da declaração, ou como parte do Declarador para uma variável em particular, ou ambos, como neste exemplo:byte[] rowvector, colvector, matrix[];

Esta declaração é equivalente a: byte rowvector[], colvector[], matrix[][];

Yuval Adam
fonte
11

Não há diferença entre os dois; ambos declaram uma matriz de ints. No entanto, o primeiro é preferido, pois mantém as informações de tipo em um só lugar. O último só é realmente suportado em benefício dos programadores de C / C ++ que se mudam para Java.

Luke Woodward
fonte
11

Não há diferença real; Contudo,

double[] items = new double[10];

é preferido, pois indica claramente que o tipo é uma matriz.

Aaron Maenpaa
fonte
1
itens duplas [] é realmente lá para os programadores C
Steve Kuo
@ Steve, deve ser por isso que continuo fazendo dessa maneira. :-)
Paul Tomblin
Pode-se fazer um contra-argumento que itens duplos [] indiquem claramente o tipo e, posteriormente, esses itens são uma matriz - tudo depende do que você está acostumado.
MetroidFan2002 01/03/09
7

Ambos são igualmente válidos. A int puzzle[]forma é, contudo, desencorajados, a int[] puzzleé o preferido de acordo com as convenções de codificação . Veja também o tutorial oficial sobre matrizes Java :

Da mesma forma, você pode declarar matrizes de outros tipos:

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

Você também pode colocar colchetes após o nome da matriz:

float anArrayOfFloats[]; // this form is discouraged

No entanto, a convenção desencoraja esse formulário; os colchetes identificam o tipo de matriz e devem aparecer com a designação de tipo.

Observe o último parágrafo.

Eu recomendo a leitura dos tutoriais oficiais da Sun / Oracle em vez de alguns de terceiros. Caso contrário, você correria o risco de aprender más práticas.

BalusC
fonte
6

É uma forma alternativa, que foi emprestada de C , no qual o java é baseado.

Como curiosidade, existem três maneiras de definir um mainmétodo válido em java:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)
Boêmio
fonte
1
Com o devido respeito, mas essa resposta é a pergunta !!!!! É a terceira forma, especificada, realmente tem que fazer qualquer coisa, com o que está sendo solicitado na postagem original. Os dois primeiros argumentos são matrizes para o método principal, embora a terceira entidade seja um argumento variável (que não é o mesmo que uma matriz). Se definir o método principal é a questão, pode-se adicionar outro formulário para definir também o método principal, como por exemplo public static void main ( String \u005B \u005D args ), essa também é outra variante.
nIcE cow
2
@nIcEcOw um parâmetro varargs, por exemplo String... param, é uma matriz
Bohemian
Apenas uma simples dúvida surge, se ambas são matrizes, ou seja, String [] e String ... , then why it is not possible to call a method like say someMethod (1, 2) `se alguém estiver definindo someMethodcomo someMethod ( int[] numbers ). As matrizes exigem que o argumento deva ser do local contíguo da memória, porém varargs, criarão uma matriz com os argumentos fornecidos primeiro. Além disso, a varargspode ser apenas o argumento final de um método, embora o mesmo não seja verdadeiro para uma matriz.
nIcE cOw
2
@nIcEcOw, mas você pode chamar um varargs com uma matriz, ou seja, meth(int... a)pode ser chamado como meth(1, 2)ou meth(new int[] {1, 2}). Varargs é o açúcar sintático que transforma a primeira versão na segunda. O tipo real (bytecode) do parâmetro é um tipo de matriz. Quanto a ter que ser o último, se você pensar bem, não há outra escolha sensata.
Bohemian
5

Não há diferença, mas a Sun recomenda colocá-lo ao lado do tipo, conforme explicado aqui

André
fonte
3

A opção mais preferida é int[] a- porque int[]é o tipo e aé o nome. (sua segunda opção é a mesma, com espaço extraviado)

Funcionalmente, não há diferença entre eles.

Bozho
fonte
3

A especificação da linguagem Java diz:

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

Assim, eles resultarão exatamente no mesmo código de bytes.

Kdeveloper
fonte
2

Em Java, esses são simplesmente métodos sintáticos diferentes de dizer a mesma coisa.

Zach Lute
fonte
2

Eles são iguais. Um é mais legível (para alguns) que o outro.

basszero
fonte
2

Eles são completamente equivalentes. int [] arrayé o estilo preferido. int array[]é fornecido apenas como um estilo compatível com C equivalente.

Derek Park
fonte
2

Ambos têm o mesmo significado. No entanto, a existência dessas variantes também permite isso:

int[] a, b[];

que é o mesmo que:

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

No entanto, esse é um estilo de codificação horrível e nunca deve ser feito.

Michael Borgwardt
fonte
você quer dizer, int [] a, b []; b torna-se uma matriz multi-dimensional
Sadananda saiam
2

Não há diferença na funcionalidade entre os dois estilos de declaração. Ambos declaram matriz de int.

Mas int[] a mantém as informações de tipo juntas e é mais detalhada, então eu prefiro.

YoK
fonte
2

Eles são os mesmos, mas há uma diferença importante entre estas declarações:

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

em 1. regular é apenas um int, em oposição a 2. onde regular e array são matrizes de int.

A segunda afirmação que você possui é, portanto, preferida, pois é mais clara. O primeiro formulário também é desencorajado de acordo com este tutorial no Oracle .

Patrick
fonte
Thanx all! Eu vou com o segundo e continuo com ele.
Espen
2

Como já foi dito, não há muita diferença (se você declarar apenas uma variável por linha).

Observe que o SonarQube trata seu segundo caso como um pequeno cheiro de código:

Os designadores de matriz "[]" devem estar no tipo, não na variável (squid: S1197)

Os designadores de matriz sempre devem estar localizados no tipo para melhor legibilidade do código. Caso contrário, os desenvolvedores devem examinar o tipo e o nome da variável para saber se uma variável é ou não uma matriz.

Exemplo de código não conforme

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

Solução compatível

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

Sim, exatamente o mesmo. Pessoalmente, eu prefiro

int[] integers; 

porque torna imediatamente óbvio para quem lê seu código que números inteiros são uma matriz de int's, em oposição a

int integers[];

o que não torna tudo tão óbvio, principalmente se você tiver várias declarações em uma linha. Mas, novamente, eles são equivalentes, então tudo se resume à preferência pessoal.

Confira esta página em matrizes em Java para obter exemplos mais detalhados.

David Watson
fonte
1

ao declarar uma única referência de matriz, não há muita diferença entre elas. portanto, as duas declarações a seguir são iguais.

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

ao declarar várias referências de matriz, podemos encontrar diferença entre elas. as duas declarações a seguir significam o mesmo. de fato, cabe ao programador qual deles seguir. mas a notação java padrão é recomendada.

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

Ambos estão bem. Sugiro escolher um e ficar com ele. (Eu faço o segundo)

Albert
fonte
0

Embora a int integers[]solução tenha raízes na linguagem C (e, portanto, possa ser considerada a abordagem "normal"), muitas pessoas acham int[] integersmais lógico, pois não permite criar variáveis ​​de tipos diferentes (por exemplo, int e array) em uma declaração (em oposição a a declaração de estilo C).

Kos
fonte