Sự khác biệt giữa mảng int [] và mảng int []


234

Gần đây tôi đã suy nghĩ về sự khác biệt giữa hai cách định nghĩa một mảng:

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

Có sự khác biệt?

Câu trả lời:


281

Chúng giống hệt nhau về mặt ngữ nghĩa. Các int array[]cú pháp chỉ được bổ sung vào các lập trình viên giúp đỡ C làm quen với java.

int[] array là nhiều thích hợp hơn, và ít nhầm lẫn.


55
[] Là một phần của TYPE, không phải của NAME. Đối với tôi, đó là sự khác biệt lớn nhất.
André Chalella

4
@Andre - và trong C, [] một phần của trình khai báo, không phải là trình xác định khai báo, do đó là int array[]cú pháp. Cũng logic ... theo một cách nào đó. :)
Kos

1
C chơi trò chơi nhỏ này :) Và tôi thấy nó thật quyến rũ :) Ngay cả với ... con trỏ. Cú pháp 'chính xác' cho con trỏ là int * imAPulum. Thật ngớ ngẩn và gọn gàng.
ScarletAmaranth

4
int array[]có ý nghĩa hơn với tôi Bạn nghĩ gì về tuyên bố này? int[] x, y? Là ymột mảng hay không? Có lẽ nó là, có thể nó không. Chỉ có các bậc thầy của Java mới có thể trả lời một cách tự tin ....
user1508893

24
Trong trường hợp int[] x, y, ylà một mảng (vì []thuộc về loại) và trong trường hợp int x[], y, ykhông phải là một mảng ( []thuộc về biến).
Triang3l

171

Có một sự khác biệt nhỏ, nếu bạn tình cờ khai báo nhiều hơn một biến trong cùng một khai bá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

Lưu ý rằng đây là phong cách mã hóa xấu, mặc dù trình biên dịch gần như chắc chắn sẽ bắt lỗi của bạn ngay khi bạn cố gắng sử dụng d.


52

Không có sự khác biệt.

Tôi thích type[] nameđịnh dạng tại là rõ ràng rằng biến là một mảng (ít nhìn xung quanh để tìm ra nó là gì).

BIÊN TẬP:

Đợi đã, có một sự khác biệt (tôi quên vì tôi không bao giờ khai báo nhiều hơn một biến tại một thời điểm):

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

27

Không, đây là như nhau. Tuy nhiên

byte[] rowvector, colvector, matrix[];

tương đương với:

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

Lấy từ Đặc tả Java . Đó nghĩa là

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

là khác nhau Tôi sẽ không đề nghị một trong nhiều tuyên bố này. Dễ nhất để đọc sẽ (có thể) là:

int[] a;
int[] b;

3
Tuy nhiên, nên sử dụng một khai báo cho mỗi mã định danh thay vì khai báo nhiều mã định danh trong một dòng.
rsp

@rsp - Hoàn toàn đồng ý, chỉnh sửa một thực tiễn tốt nhất. Tuy nhiên, đó là gợi ý thực hành tốt là gì.
Ishtar

25

Từ phần 10.2 của Đặc tả ngôn ngữ Java :

[] Có thể xuất hiện như một phần của loại ở đầu khai báo hoặc là một phần của công cụ khai báo cho một biến cụ thể hoặc cả hai, như trong ví dụ này:

 byte[] rowvector, colvector, matrix[];

Tuyên bố này tương đương với:

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

Cá nhân gần như tất cả các mã Java mà tôi từng thấy sử dụng mẫu đầu tiên, điều này có ý nghĩa hơn bằng cách giữ tất cả các thông tin loại về biến ở một nơi. Tôi ước gì hình thức thứ hai không được phép, thành thật mà nói ... nhưng đó là cuộc sống ...

May mắn là tôi không nghĩ rằng tôi đã từng thấy mã (hợp lệ) này:

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

Cảm ơn, tôi đã gãi đầu về điều này. Thật kỳ lạ, khi googling tiêu đề của câu hỏi tôi không tìm thấy gì ...
Yoav

3
+1 Tôi đồng ý về việc không cho phép hình thức thứ hai. +1 cũng vì tôi không nhận ra bạn có thể kết hợp trận đấu như thế nào int[] a[];- điều đó sẽ không bao giờ không rõ ràng ;-)
Bohemian


13

Không khác nhau.

Trích dẫn từ Sun :

Cái []có thể xuất hiện như một phần của kiểu ở đầu khai báo hoặc là một phần của trình khai báo cho một biến cụ thể hoặc cả hai, như trong ví dụ này:byte[] rowvector, colvector, matrix[];

Tuyên bố này tương đương với: byte rowvector[], colvector[], matrix[][];


11

Không có bất kỳ sự khác biệt giữa hai; cả hai khai báo một mảng của ints. Tuy nhiên, trước đây được ưa thích vì nó giữ tất cả các thông tin loại ở một nơi. Cái sau chỉ thực sự được hỗ trợ vì lợi ích của các lập trình viên C / C ++ khi chuyển sang Java.


11

Không có sự khác biệt thực sự; Tuy nhiên,

double[] items = new double[10];

được ưa thích vì nó chỉ rõ rằng loại là một mảng.


1
vật phẩm đôi [] thực sự có sẵn cho các lập trình viên C
Steve Kuo

@Steve, Đó phải là lý do tại sao tôi tiếp tục làm theo cách đó. :-)
Paul Tomblin

Một phản biện có thể được thực hiện rằng các mục kép [] chỉ rõ loại và sau đó các mục đó thực sự là một mảng - tất cả phụ thuộc vào những gì bạn cảm thấy thoải mái.
MetroidFan2002

7

Cả hai đều có giá trị như nhau. Các int puzzle[]tuy nhiên hình thức không được khuyến khích, sự int[] puzzleđược ưa thích theo công ước mã hóa . Xem thêm hướng dẫn mảng Java chính thức :

Tương tự, bạn có thể khai báo mảng các loại khác:

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

Bạn cũng có thể đặt dấu ngoặc vuông sau tên của mảng:

float anArrayOfFloats[]; // this form is discouraged

Tuy nhiên, quy ước không khuyến khích hình thức này; dấu ngoặc xác định kiểu mảng và sẽ xuất hiện với chỉ định kiểu.

Lưu ý đoạn cuối.

Tôi khuyên bạn nên đọc các hướng dẫn chính thức của Sun / Oracle thay vì một số bên thứ 3. Nếu không, bạn sẽ có nguy cơ cuối cùng trong việc học tập thực hành xấu.


6

Nó là một hình thức thay thế, được mượn từ C , dựa trên java.

Vì tò mò, có ba cách để xác định một mainphương thức hợp lệ trong java:

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

1
Với sự tôn trọng, nhưng câu trả lời này có phải là câu hỏi không !!!!! Là hình thức thứ ba, được chỉ định, thực sự phải làm bất cứ điều gì, với những gì đang được yêu cầu trong bài viết gốc. Hai đối số đầu tiên là mảng cho phương thức chính, mặc dù thực thể thứ ba là một đối số biến (không giống như một mảng). Nếu xác định phương thức chính là câu hỏi, thì người ta có thể thêm một hình thức khác để xác định một phương thức chính nữa, như public static void main ( String \u005B \u005D args ), đây cũng là một biến thể khác.
kể từ

2
@nIcEcOw một varargs tham số, ví dụ String... param, một mảng
Bohemian

Chỉ cần một nghi ngờ đơn giản xuất hiện, nếu cả hai đều là mảng, tức là Chuỗi [] và Chuỗi ... , then why it is not possible to call a method like say someMethod (1, 2) `nếu một định nghĩa someMethodsomeMethod ( int[] numbers ). Mảng yêu cầu rằng đối số, phải từ vị trí bộ nhớ liền kề, tuy nhiên varargs, sẽ tạo ra một mảng trong số các đối số được cung cấp trước tiên. Hơn nữa, một varargschỉ có thể là đối số cuối cùng của một phương thức, mặc dù điều tương tự không đúng với một mảng.
kể từ

2
@nIcEcOw nhưng bạn có thể gọi một varargs với một mảng, tức là meth(int... a)có thể được gọi là một trong hai meth(1, 2)hoặc meth(new int[] {1, 2}). Varargs là cú pháp đường biến phiên bản đầu tiên thành phiên bản thứ hai. Kiểu thực tế (mã byte) của tham số là kiểu mảng. Về việc phải là người cuối cùng, nếu bạn nghĩ về nó, không có lựa chọn lành mạnh nào khác.
Bohemian

5

Không có sự khác biệt, nhưng Sun khuyên bạn nên đặt nó bên cạnh loại như được giải thích ở đây


3

Tùy chọn ưa thích nhất là int[] a- bởi vì int[]là loại và alà tên. (tùy chọn thứ 2 của bạn giống như thế này, với không gian đặt sai vị trí)

Về mặt chức năng không có sự khác biệt giữa chúng.


3

Các ngôn ngữ Java Specification nói:

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

Do đó, chúng sẽ dẫn đến chính xác cùng một mã byte.


2

Trong Java, đây đơn giản là các phương thức cú pháp khác nhau để nói cùng một điều.


2

Chúng giống nhau. Một cái dễ đọc hơn (với một số) so với cái kia.


2

Chúng hoàn toàn tương đương. int [] arraylà phong cách ưa thích. int array[]chỉ được cung cấp như một kiểu tương thích, tương thích C.


2

Cả hai đều có cùng một ý nghĩa. Tuy nhiên, sự tồn tại của các biến thể này cũng cho phép điều này:

int[] a, b[];

tương tự như:

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

Tuy nhiên, đây là phong cách mã hóa khủng khiếp và không bao giờ nên được thực hiện.


bạn muốn nói, int [] a, b []; b trở thành một mảng đa chiều
sadananda salam

2

Không có sự khác biệt về chức năng giữa cả hai phong cách khai báo. Cả hai khai báo mảng int.

Nhưng int[] a giữ thông tin loại với nhau và dài dòng hơn vì vậy tôi thích nó.


2

Chúng giống nhau, nhưng có một sự khác biệt quan trọng giữa các tuyên bố này:

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

trong 1. thông thường chỉ là một int, trái ngược với 2. trong đó cả hai thông thường và mảng là các mảng của int.

Tuyên bố thứ hai bạn có do đó được ưa thích, vì nó rõ ràng hơn. Hình thức đầu tiên cũng không được khuyến khích theo hướng dẫn này trên Oracle .


Thanx tất cả! Tôi sẽ đi với cái thứ hai và gắn bó với nó.
Espen

2

Như đã nêu, không có nhiều khác biệt (nếu bạn chỉ khai báo một biến trên mỗi dòng).

Lưu ý rằng SonarQube coi trường hợp thứ hai của bạn là mùi mã nhỏ :

Chỉ định mảng "[]" phải thuộc loại chứ không phải biến (squid: S1197)

Các trình chỉ định mảng phải luôn được đặt trên loại để dễ đọc mã hơn. Mặt khác, các nhà phát triển phải nhìn cả vào loại và tên biến để biết liệu một biến có phải là một mảng hay không.

Ví dụ mã không tuân thủ

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

Giải pháp tuân thủ

int[][] matrix;   // Compliant

1

Đúng, giống hệt nhau. Cá nhân, tôi thích

int[] integers; 

bởi vì nó làm cho nó rõ ràng ngay lập tức đối với bất kỳ ai đọc mã của bạn rằng số nguyên là một mảng của int, trái ngược với

int integers[];

điều này không làm cho nó trở nên rõ ràng, đặc biệt nếu bạn có nhiều khai báo trong một dòng. Nhưng một lần nữa, chúng là tương đương, vì vậy nó đi xuống theo sở thích cá nhân.

Kiểm tra trang này trên các mảng trong Java để biết thêm các ví dụ chuyên sâu.


1

khi khai báo một tham chiếu mảng đơn, không có nhiều khác biệt giữa chúng. do đó hai khai báo sau là như nhau.

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

khi khai báo nhiều tham chiếu mảng, chúng ta có thể tìm thấy sự khác biệt giữa chúng. hai câu sau đây có nghĩa giống nhau. trong thực tế, nó phụ thuộc vào lập trình viên. nhưng ký hiệu java tiêu chuẩn được khuyến nghị.

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

0

Cả hai đều ổn. Tôi đề nghị chọn một và gắn bó với nó. (Tôi làm cái thứ hai)


0

Mặc dù int integers[]giải pháp bắt nguồn từ ngôn ngữ C (và do đó có thể được coi là cách tiếp cận "bình thường"), nhiều người thấy int[] integershợp lý hơn vì nó không cho phép tạo các biến có kiểu khác nhau (ví dụ như một int và một mảng) trong một khai báo (trái ngược với khai báo kiểu C).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.