Różnica między tablicą int [] a tablicą int []

234

Ostatnio zastanawiałem się nad różnicą między dwoma sposobami definiowania tablicy:

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

Czy jest jakaś różnica?

mslot
źródło

Odpowiedzi:

281

Są semantycznie identyczne. int array[]Składnia dodano tylko do pomocy programistów C przyzwyczaić do java.

int[] array jest o wiele bardziej preferowane i mniej mylące.

skaffman
źródło
55
[] Jest częścią TYPE, a nie NAME. To dla mnie największa różnica.
André Chalella
4
@Andre - aw C [] jest to część deklaratora, a nie specyfikator deklaracji, stąd int array[]składnia. Również logiczne ... w jakiś pokręcony sposób. :)
Kos
1
C gra w tę małą grę :) I uważam, że jest urocza :) Nawet z podobnymi ... wskaźnikami. „Poprawną” składnią c dla wskaźników jest int * imAPointer. Jest głupie i schludne.
ScarletAmaranth
4
int array[]ma dla mnie więcej sensu. Co sądzisz o tej deklaracji? int[] x, y? Jest ytablicą czy nie? Może tak, a może nie. Tylko guru Java mogą odpowiedzieć z pewnością ....
user1508893
24
W przypadku int[] x, y, yjest tablicą (ponieważ []należy do typu), aw przypadku int x[], y, ynie jest tablicą ( []należy do zmiennej).
Triang3l
171

Jest jedna drobna różnica, jeśli zdarza się, że deklarujesz więcej niż jedną zmienną w tej samej deklaracji:

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

Zauważ, że jest to zły styl kodowania, chociaż kompilator prawie na pewno złapie twój błąd w momencie, gdy spróbujesz go użyć d.

Adam Rosenfield
źródło
52

Nie ma różnicy.

Wolę type[] nameformat jest jasne, że zmienna jest tablicą (mniej rozglądając się, aby dowiedzieć się, co to jest).

EDYTOWAĆ:

Och, czekaj, jest różnica (zapomniałem, ponieważ nigdy nie deklaruję więcej niż jednej zmiennej na raz):

int[] foo, bar; // both are arrays
int foo[], bar; // foo is an array, bar is an int.
TofuBeer
źródło
27

Nie, są takie same. jednak

byte[] rowvector, colvector, matrix[];

jest równa:

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

Zaczerpnięte ze specyfikacji Java . Oznacza to, że

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

są różne. Nie poleciłbym żadnej z tych wielokrotnych deklaracji. Najłatwiejszy do odczytania to (prawdopodobnie):

int[] a;
int[] b;
Isztar
źródło
3
Dobrą praktyką jest jednak stosowanie jednej deklaracji na identyfikator zamiast deklarowania wielu identyfikatorów w jednym wierszu.
rsp
@rsp - Całkowicie się zgadzam, zredagowałem najlepszą praktykę w. Mimo to sugeruje, co jest dobrą praktyką.
Ishtar
25

Z sekcji 10.2 specyfikacji języka Java :

[] Może pojawić się jako część typu na początku deklaracji lub jako część deklaratora dla określonej zmiennej, lub obu, jak w tym przykładzie:

 byte[] rowvector, colvector, matrix[];

Ta deklaracja jest równoważna z:

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

Osobiście prawie wszyscy kod Java, jaki kiedykolwiek widziałem, używa pierwszej formy, co ma większy sens, ponieważ wszystkie informacje o zmiennej są przechowywane w jednym miejscu. Chciałbym, żeby druga forma została niedozwolona, ​​szczerze mówiąc ... ale takie jest życie ...

Na szczęście chyba nie widziałem tego (poprawnego) kodu:

String[] rectangular[] = new String[10][10];
Jon Skeet
źródło
Dzięki, podrapałem się po tym. O dziwo, przeglądając tytuł pytania, nic nie znalazłem ...
Yoav
3
+1 Zgadzam się na niedozwolenie drugiego formularza. +1 też, ponieważ nie zdawałem sobie sprawy, że możesz mieszać mecze typu „n” tak int[] a[];- to nigdy nie będzie niejasne ;-)
Bohemian
13

Bez różnicy.

Cytowanie z Sun :

[]Może pojawić się jako część typu na początku zgłoszenia, lub jako część declarator dla danej zmiennej, lub jedno i drugie, jak w poniższym przykładzie:byte[] rowvector, colvector, matrix[];

Ta deklaracja jest równoważna z: byte rowvector[], colvector[], matrix[][];

Yuval Adam
źródło
11

Nie ma między nimi żadnej różnicy; oba deklarują tablicę ints. Jednak ta pierwsza jest preferowana, ponieważ utrzymuje informacje o typie w jednym miejscu. To ostatnie jest obsługiwane tylko dla programistów C / C ++ przechodzących na Javę.

Luke Woodward
źródło
11

Nie ma prawdziwej różnicy; jednak,

double[] items = new double[10];

jest preferowany, ponieważ wyraźnie wskazuje, że typ jest tablicą.

Aaron Maenpaa
źródło
1
podwójne elementy [] są naprawdę dostępne dla programistów C
Steve Kuo,
@ Steve, Właśnie dlatego ciągle tak robię. :-)
Paul Tomblin
Kontrargumentem można uczynić, że podwójne elementy [] wyraźnie wskazują na typ, a później tak się składa, że ​​elementy są tablicą - wszystko zależy od tego, z czym czujesz się komfortowo.
MetroidFan2002
7

Oba są jednakowo ważne. int puzzle[]Forma jest jednak zniechęcać The int[] puzzlejest korzystne według standardy kodowania . Zobacz także oficjalny samouczek dotyczący tablic Java :

Podobnie możesz zadeklarować tablice innych typów:

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

Możesz również umieścić nawiasy kwadratowe po nazwie tablicy:

float anArrayOfFloats[]; // this form is discouraged

Jednak konwencja odradza tę formę; nawiasy kwadratowe określają typ tablicy i powinny pojawić się wraz z oznaczeniem typu.

Zwróć uwagę na ostatni akapit.

Zalecam przeczytanie oficjalnych samouczków Sun / Oracle, a nie niektórych zewnętrznych. W przeciwnym razie zaryzykowałbyś, ucząc się złych praktyk.

BalusC
źródło
6

Jest to forma alternatywna, z której została zapożyczona C, na której oparta jest Java.

Ciekawostką są trzy sposoby zdefiniowania prawidłowej mainmetody w java:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)
Czeski
źródło
1
Z należytym szacunkiem, ale czy ta odpowiedź jest pytaniem !!!!! Czy podana trzecia forma rzeczywiście musi coś zrobić z tym, o co pytano w oryginalnym poście. Pierwsze dwa argumenty są tablicami metody głównej, chociaż trzeci byt jest argumentem zmiennym (który nie jest taki sam jak tablica). Jeśli pytaniem jest zdefiniowanie metody głównej, można dodać inną formę, aby zdefiniować również metodę główną, na przykład public static void main ( String \u005B \u005D args )jest to również inny wariant.
nic nie jest
2
@nIcEcOw varargs parametru, na przykład String... param, jest tablicą
Czech
Powstaje prosta wątpliwość, czy obie są tablicami, tzn. String [] i String ... , then why it is not possible to call a method like say someMethod (1, 2) `jeśli definiuje się someMethodjako someMethod ( int[] numbers ). Tablice wymagają jednak, aby argument musiał pochodzić z ciągłego miejsca w pamięci, ale varargsnajpierw utworzy tablicę z podanych argumentów. Co więcej, a varargsmoże być tylko ostatnim argumentem metody, chociaż nie dotyczy to również tablicy.
nic nie jest
2
@nIcEcOw, ale można wywoływać varargs za pomocą tablicy, tzn. meth(int... a)można wywoływać jako jeden meth(1, 2)lub meth(new int[] {1, 2}). Varargs to cukier składniowy, który zmienia pierwszą wersję w drugą wersję. Rzeczywisty typ (kod bajtowy) parametru to typ tablicy. Jeśli chodzi o konieczność bycia ostatnim, jeśli się nad tym zastanowić, nie ma innego rozsądnego wyboru.
Czeski
5

Nie ma różnicy, ale Sun zaleca umieszczenie go obok typu opisanego tutaj

André
źródło
3

Najbardziej preferowaną opcją jest int[] a- ponieważ int[]jest to typ i anazwa. (Twoja druga opcja jest taka sama, z niewłaściwie umieszczonym miejscem)

Funkcjonalnie nie ma między nimi żadnej różnicy.

Bozho
źródło
3

Java Language Specification mówi:

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

W ten sposób otrzymają dokładnie ten sam kod bajtowy.

Kdeveloper
źródło
2

W Javie są to po prostu różne składniowe metody mówienia tego samego.

Zach Lute
źródło
2

Oni są tacy sami. Jeden jest bardziej czytelny (dla niektórych) niż drugi.

basszero
źródło
2

Są całkowicie równoważne. int [] arrayjest preferowanym stylem. int array[]jest po prostu zapewniony jako równoważny styl zgodny z C.

Derek Park
źródło
2

Oba mają to samo znaczenie. Jednak istnienie tych wariantów pozwala również na to:

int[] a, b[];

który jest taki sam jak:

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

Jest to jednak okropny styl kodowania i nigdy nie należy tego robić.

Michael Borgwardt
źródło
masz na myśli powiedzieć int [] a, b []; b staje się wielowymiarową tablicą
sadananda salam
2

Nie ma różnicy w funkcjonalności między obydwoma stylami deklaracji. Obie deklarują tablicę int.

Ale int[] a łączy informacje o typie i jest bardziej szczegółowe, więc wolę.

YoK
źródło
2

Są takie same, ale istnieje istotna różnica między tymi stwierdzeniami:

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

w 1. regular jest tylko liczbą całkowitą, w przeciwieństwie do 2. gdzie zarówno regularna, jak i tablica są tablicami liczb całkowitych.

W związku z tym preferowane jest drugie stwierdzenie, ponieważ jest bardziej przejrzyste. Pierwsza forma jest również odradzana zgodnie z tym samouczkiem na temat Oracle .

Patrick
źródło
Dziękuję wszystkim! Pójdę z drugim i trzymam się go.
Espen
2

Jak już wspomniano, nie ma dużej różnicy (jeśli zadeklarujesz tylko jedną zmienną na linię).

Pamiętaj, że SonarQube traktuje twój drugi przypadek jako niewielki zapach kodu:

Oznaczenia tablic „[]” powinny być na typie, a nie na zmiennej (squid: S1197)

Oznaczenia tablic powinny zawsze znajdować się na typie, aby zapewnić lepszą czytelność kodu. W przeciwnym razie programiści muszą spojrzeć zarówno na typ, jak i nazwę zmiennej, aby wiedzieć, czy zmienna jest tablicą.

Przykład niezgodnego kodu

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

Zgodne rozwiązanie

int[][] matrix;   // Compliant
Robert Hume
źródło
1

Tak, dokładnie tak samo. Osobiście wolę

int[] integers; 

ponieważ od razu staje się oczywiste dla każdego czytającego Twój kod, że liczby całkowite są tablicami liczb całkowitych, w przeciwieństwie do

int integers[];

co nie czyni tego tak oczywistym, szczególnie jeśli masz wiele deklaracji w jednym wierszu. Ale znowu są one równoważne, więc sprowadza się to do osobistych preferencji.

Sprawdź tę stronę dotyczącą tablic w Javie, aby uzyskać bardziej szczegółowe przykłady.

David Watson
źródło
1

deklarując odniesienie do pojedynczej tablicy, nie ma między nimi dużej różnicy. więc następujące dwie deklaracje są takie same.

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

deklarując wiele odniesień tablicowych, możemy znaleźć różnicę między nimi. następujące dwa stwierdzenia oznaczają to samo. w rzeczywistości to od programisty zależy, który z nich śledzi. ale zalecana jest standardowa notacja Java.

int a[],b[],c[]; // three array references
int[] a,b,c;  // three array references
PoornaChandra
źródło
0

Oba są ok. Sugeruję wybranie jednego i trzymanie się go. (Robię drugi)

Albert
źródło
0

Chociaż int integers[]rozwiązanie zakorzenia się w języku C (i dlatego można je uznać za „normalne” podejście), wiele osób uważa, że ​​jest int[] integersbardziej logiczny, ponieważ nie pozwala na tworzenie zmiennych różnych typów (tj. Int i tablica) w jednej deklaracji (w przeciwieństwie do deklaracja w stylu C).

Kos
źródło