Perbedaan antara int [] array dan int array []

234

Baru-baru ini saya memikirkan perbedaan antara dua cara mendefinisikan array:

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

Apakah ada perbedaan?

mslot
sumber

Jawaban:

282

Mereka identik secara semantik. Ituint array[] sintaks hanya ditambahkan ke bantuan C programmer terbiasa dengan java.

int[] array jauh lebih disukai, dan kurang membingungkan.

skaffman
sumber
55
[] Adalah bagian dari TYPE, bukan dari NAME. Bagi saya, itulah perbedaan terbesar.
André Chalella
4
@Andre - dan dalam C, [] bagian dari deklarator, bukan specifier deklarasi, maka int array[]sintaksnya. Juga logis ... dalam beberapa cara. :)
Kos
1
C memainkan permainan kecil ini :) Dan saya merasa sangat menawan :) Bahkan dengan ... pointer. Sintaks c yang benar untuk pointer adalah int * imAPointer. Itu konyol dan rapi.
ScarletAmaranth
4
int array[]lebih masuk akal bagi saya. Apa pendapat Anda tentang deklarasi ini? int[] x, y? Apakah yarray atau tidak? Mungkin ya, mungkin juga tidak. Hanya guru Java yang dapat menjawab dengan percaya diri ....
user1508893
24
Dalam hal int[] x, y, yadalah array (karena []milik tipe), dan dalam kasus int x[], y, ybukan array ( []milik variabel).
Triang3l
172

Ada satu perbedaan kecil, jika Anda mendeklarasikan lebih dari satu variabel dalam deklarasi yang sama:

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

Perhatikan bahwa ini adalah gaya pengkodean yang buruk, meskipun kompiler hampir pasti akan menangkap kesalahan Anda saat Anda mencoba menggunakannya d.

Adam Rosenfield
sumber
52

Tidak ada perbedaan.

Saya lebih suka type[] name format di jelas bahwa variabel adalah array (kurang melihat-lihat untuk mengetahui apa itu).

EDIT:

Oh, tunggu, ada perbedaan (saya lupa karena saya tidak pernah mendeklarasikan lebih dari satu variabel sekaligus):

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

Tidak, ini sama saja. Namun

byte[] rowvector, colvector, matrix[];

setara dengan:

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

Diambil dari Spesifikasi Java . Itu artinya

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

berbeda. Saya tidak akan merekomendasikan salah satu dari beberapa deklarasi ini. Paling mudah dibaca adalah (mungkin):

int[] a;
int[] b;
Ishtar
sumber
3
Namun adalah praktik yang baik untuk menggunakan satu deklarasi per pengidentifikasi daripada mendeklarasikan beberapa pengidentifikasi dalam satu baris.
rsp
@ rsp - Sepenuhnya setuju, mengedit praktik terbaik di. Namun, disarankan praktik apa yang baik.
Ishtar
25

Dari bagian 10.2 dari Spesifikasi Bahasa Jawa :

[] Dapat muncul sebagai bagian dari tipe di awal deklarasi, atau sebagai bagian dari deklarator untuk variabel tertentu, atau keduanya, seperti dalam contoh ini:

 byte[] rowvector, colvector, matrix[];

Deklarasi ini setara dengan:

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

Secara pribadi hampir semua kode Java yang pernah saya lihat menggunakan bentuk pertama, yang lebih masuk akal dengan menyimpan semua informasi jenis tentang variabel di satu tempat. Saya berharap bentuk kedua tidak diizinkan, jujur ​​... tapi begitulah hidup ...

Untungnya saya tidak berpikir saya pernah melihat kode (valid) ini:

String[] rectangular[] = new String[10][10];
Jon Skeet
sumber
Terima kasih, saya menggaruk-garuk kepala karena hal ini. Anehnya, ketika googling judul pertanyaan saya tidak menemukan apa-apa ...
Yoav
3
+1 Saya setuju tentang pemblokiran formulir kedua. Memberi +1 juga karena saya tidak menyadari Anda dapat mencocokkan 'n' dengan int[] a[];- - itu tidak akan pernah menjadi tidak jelas ;-)
Bohemian
13

Tidak ada perbedaan.

Mengutip dari Sun :

Itu []mungkin muncul sebagai bagian dari tipe di awal deklarasi, atau sebagai bagian dari deklarator untuk variabel tertentu, atau keduanya, seperti dalam contoh ini:byte[] rowvector, colvector, matrix[];

Deklarasi ini setara dengan: byte rowvector[], colvector[], matrix[][];

Yuval Adam
sumber
11

Tidak ada perbedaan di antara keduanya; keduanya mendeklarasikan array ints. Namun, yang pertama lebih disukai karena menyimpan informasi jenis di satu tempat. Yang terakhir hanya benar-benar didukung untuk kepentingan programmer C / C ++ pindah ke Jawa.

Luke Woodward
sumber
11

Tidak ada perbedaan nyata; namun,

double[] items = new double[10];

lebih disukai karena jelas menunjukkan bahwa jenisnya adalah array.

Aaron Maenpaa
sumber
1
item ganda [] benar-benar ada untuk programmer C
Steve Kuo
@ Seve, Itu sebabnya saya terus melakukan itu. :-)
Paul Tomblin
Sebuah argumen balik dapat dibuat bahwa item ganda [] dengan jelas menunjukkan jenisnya dan kemudian item-item tersebut kebetulan merupakan sebuah array - semuanya tergantung pada apa yang Anda sukai.
MetroidFan2002
7

Keduanya sama-sama valid. Namun int puzzle[]bentuknya tidak disarankan, int[] puzzlelebih disukai sesuai dengan konvensi pengkodean . Lihat juga tutorial array Java resmi :

Demikian pula, Anda dapat mendeklarasikan array tipe lain:

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

Anda juga dapat menempatkan tanda kurung setelah nama array:

float anArrayOfFloats[]; // this form is discouraged

Namun, konvensi tidak menganjurkan formulir ini; tanda kurung mengidentifikasi tipe array dan akan muncul dengan penunjukan tipe.

Perhatikan paragraf terakhir.

Saya sarankan membaca tutorial resmi Sun / Oracle daripada beberapa tutorial pihak ke-3. Anda sebaliknya akan berisiko berakhir dalam mempelajari praktik buruk.

BalusC
sumber
6

Ini adalah bentuk alternatif, yang dipinjam dari C, di mana java didasarkan.

Sebagai rasa ingin tahu, ada tiga cara untuk mendefinisikan mainmetode yang valid di java:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)
Orang Bohemian
sumber
1
Dengan hormat, tetapi apakah jawaban ini adalah pertanyaannya !!!!! Apakah bentuk ketiga, ditentukan, sebenarnya harus melakukan apa saja, dengan apa yang ditanyakan dalam posting asli. Dua argumen pertama adalah array ke metode utama, meskipun entitas ketiga adalah argumen variabel (yang tidak sama dengan array). Jika mendefinisikan metode utama adalah pertanyaan, maka seseorang dapat menambahkan formulir lain untuk mendefinisikan metode utama juga, seperti public static void main ( String \u005B \u005D args ), ini adalah varian lain juga.
nIcE cOw
2
@nIcEcOw sebuah varargs parameter, misalnya String... param, adalah sebuah array
Bohemian
Hanya keraguan sederhana yang muncul, jika keduanya adalah array, yaitu String [] dan String ... , then why it is not possible to call a method like say someMethod (1, 2) `jika seseorang mendefinisikan someMethodsebagai someMethod ( int[] numbers ). Array menuntut bahwa argumen, harus dari lokasi memori yang berdekatan varargs, akan membuat array dari argumen yang disediakan terlebih dahulu. Selain itu, a varargshanya bisa menjadi argumen akhir dari suatu metode, meskipun hal yang sama tidak berlaku untuk array.
nIcE cOw
2
@nIcEcOw tetapi Anda dapat memanggil varargs dengan array, yaitu meth(int... a)dapat disebut sebagai salah satu meth(1, 2)atau meth(new int[] {1, 2}). Varargs adalah gula sintaksis yang mengubah versi pertama menjadi versi kedua. Tipe aktual (bytecode) dari parameter adalah tipe array. Adapun harus menjadi yang terakhir, jika Anda berpikir tentang hal itu, tidak ada pilihan waras lainnya.
Bohemian
5

Tidak ada perbedaan, tetapi Sun merekomendasikan untuk meletakkannya di sebelah tipe seperti yang dijelaskan di sini

André
sumber
3

Opsi yang paling disukai adalah int[] a- karena int[]jenisnya, dana nama. (Opsi ke-2 Anda sama dengan ini, dengan ruang yang salah tempat)

Secara fungsional tidak ada perbedaan di antara mereka.

Bozho
sumber
3

The Java Language Specification mengatakan:

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

Dengan demikian mereka akan menghasilkan kode byte yang persis sama.

Kdeveloper
sumber
2

Di Jawa, ini adalah metode sintaksis yang berbeda untuk mengatakan hal yang sama.

Zach Lute
sumber
2

Mereka sama. Satu lebih mudah dibaca (untuk beberapa) daripada yang lain.

basszero
sumber
2

Mereka sepenuhnya setara. int [] arrayadalah gaya yang disukai. int array[]hanya disediakan sebagai gaya setara C yang kompatibel.

Taman Derek
sumber
2

Keduanya memiliki makna yang sama. Namun, keberadaan varian ini juga memungkinkan ini:

int[] a, b[];

yang sama dengan:

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

Namun, ini adalah gaya pengkodean yang mengerikan dan tidak boleh dilakukan.

Michael Borgwardt
sumber
Anda bermaksud mengatakan, int [] a, b []; b menjadi array multi dimensi
sadananda salam
2

Tidak ada perbedaan fungsi antara kedua gaya deklarasi. Keduanya mendeklarasikan array int.

Tapi int[] a tetap ketikkan informasi bersama dan lebih banyak verbose jadi saya lebih suka itu.

YoK
sumber
2

Mereka sama, tetapi ada perbedaan penting antara pernyataan ini:

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

in 1. regular hanyalah sebuah int, berbeda dengan 2. di mana regular dan array adalah array dari int.

Oleh karena itu, pernyataan kedua yang Anda miliki lebih disukai, karena lebih jelas. Bentuk pertama juga tidak disarankan menurut tutorial tentang Oracle ini .

Patrick
sumber
Terima kasih semuanya! Saya akan pergi dengan yang kedua dan tetap menggunakannya.
Espen
2

Seperti yang sudah dinyatakan, tidak ada banyak perbedaan (jika Anda mendeklarasikan hanya satu variabel per baris).

Perhatikan bahwa SonarQube memperlakukan kasus kedua Anda sebagai bau kode minor :

Perancang array "[]" harus pada tipe, bukan variabel (squid: S1197)

Perancang larik harus selalu ditempatkan pada jenis untuk keterbacaan kode yang lebih baik. Jika tidak, pengembang harus melihat pada jenis dan nama variabel untuk mengetahui apakah suatu variabel adalah array.

Contoh Kode Tidak Patuh

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

Solusi yang Sesuai

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

Yap, persis sama. Secara pribadi, saya lebih suka

int[] integers; 

karena itu membuatnya segera jelas bagi siapa pun yang membaca kode Anda bahwa integer adalah array int, sebagai lawan

int integers[];

yang tidak membuat semuanya jelas, terutama jika Anda memiliki banyak deklarasi dalam satu baris. Tetapi sekali lagi, mereka setara, sehingga turun ke preferensi pribadi.

Lihat halaman ini pada array di Jawa untuk contoh lebih mendalam.

David Watson
sumber
1

ketika mendeklarasikan referensi array tunggal, tidak ada banyak perbedaan di antara mereka. jadi dua deklarasi berikut sama.

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

ketika mendeklarasikan beberapa referensi array, kita dapat menemukan perbedaan di antara mereka. dua pernyataan berikut artinya sama. pada kenyataannya, terserah programmer mana yang mengikuti. tetapi notasi java standar direkomendasikan.

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

Keduanya baik-baik saja. Saya sarankan untuk memilih satu dan tetap menggunakannya. (Saya melakukan yang kedua)

Albert
sumber
0

Sementara int integers[]solusi berakar pada bahasa C (dan dengan demikian dapat dianggap sebagai pendekatan "normal"), banyak orang menemukan int[] integerslebih logis karena tidak memungkinkan untuk membuat variabel dari jenis yang berbeda (yaitu int dan array) dalam satu deklarasi (sebagai lawan dari deklarasi C-style).

Kos
sumber