ความแตกต่างระหว่าง int [] และอาร์เรย์ int []


234

ฉันเพิ่งคิดเกี่ยวกับความแตกต่างระหว่างสองวิธีในการกำหนดอาร์เรย์:

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

มีความแตกต่างหรือไม่?

คำตอบ:


282

พวกมันเหมือนกันทางความหมาย เพิ่มint array[]ไวยากรณ์เพื่อช่วยให้โปรแกรมเมอร์ C คุ้นเคยกับจาวาเท่านั้น

int[] array เป็นที่นิยมมากกว่าและสับสนน้อยกว่า


55
[] เป็นส่วนหนึ่งของ TYPE ไม่ใช่ของ NAME สำหรับฉันนั่นคือความแตกต่างที่ยิ่งใหญ่ที่สุด
André Chalella

4
@Andre - และใน C, [] เป็นส่วนหนึ่งของตัวประกาศไม่ใช่ตัวระบุการประกาศดังนั้นint array[]ไวยากรณ์ ยังมีเหตุผล ... ในทางที่บิดเบี้ยว :)
คอส

1
C เล่นเกมเล็ก ๆ นี้ :) และฉันก็พบว่ามันมีเสน่ห์ :) แม้จะมี ... ตัวชี้ ไวยากรณ์ c 'ถูกต้อง' สำหรับพอยน์เตอร์เป็น int * imAPointer มันโง่และเรียบร้อย
ScarletAmaranth

4
int array[]ทำให้รู้สึกถึงฉันมากขึ้น คุณคิดอย่างไรเกี่ยวกับคำประกาศนี้ int[] x, y? คือyอาร์เรย์หรือไม่? บางทีมันอาจจะไม่ใช่หรือ เฉพาะกูรูของจาวาเท่านั้นที่สามารถตอบได้อย่างมั่นใจ ....
1508893

24
ในกรณีของint[] x, y, yคืออาร์เรย์ (เพราะ[]เป็นของชนิด), และในกรณีของint x[], y, yไม่ใช่อาร์เรย์ ( []เป็นของตัวแปร)
Triang3l

172

มีความแตกต่างเล็กน้อยหนึ่งอย่างถ้าคุณประกาศตัวแปรมากกว่าหนึ่งตัวในการประกาศเดียวกัน:

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

dโปรดทราบว่านี้ไม่ดีรูปแบบการเข้ารหัสแม้ว่าคอมไพเลอร์เกือบจะแน่นอนจะจับข้อผิดพลาดของคุณในขณะที่คุณพยายามที่จะใช้


52

ไม่มีความแตกต่าง

ฉันชอบ type[] nameรูปแบบที่ชัดเจนว่าตัวแปรเป็นอาร์เรย์ (มองไปรอบ ๆ น้อยลงเพื่อค้นหาว่ามันคืออะไร)

แก้ไข:

โอ้รอมีความแตกต่าง (ฉันลืมเพราะฉันไม่เคยประกาศตัวแปรมากกว่าหนึ่งครั้ง):

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

27

ไม่พวกมันเหมือนกัน อย่างไรก็ตาม

byte[] rowvector, colvector, matrix[];

เทียบเท่ากับ:

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

ที่นำมาจากJava ข้อมูลจำเพาะ นั่นหมายความว่า

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

แตกต่าง. ฉันจะไม่แนะนำการประกาศหลายอย่างใดอย่างหนึ่งเหล่านี้ ง่ายที่สุดในการอ่าน (อาจ) เป็น:

int[] a;
int[] b;

3
อย่างไรก็ตามเป็นวิธีปฏิบัติที่ดีที่จะใช้การประกาศหนึ่งรายการต่อตัวระบุแทนการประกาศตัวระบุหลายรายการในหนึ่งบรรทัด
rsp

@rsp - เห็นด้วยอย่างเต็มที่แก้ไขแนวปฏิบัติที่ดีที่สุดในกระนั้นก็เป็นการชี้แนะว่าอะไรคือแนวทางปฏิบัติที่ดี
Ishtar

25

จากส่วนที่ 10.2 ของข้อกำหนดภาษา Java :

[] อาจปรากฏขึ้นเป็นส่วนหนึ่งของประเภทที่จุดเริ่มต้นของการประกาศหรือเป็นส่วนหนึ่งของผู้ประกาศสำหรับตัวแปรเฉพาะหรือทั้งสองอย่างเช่นในตัวอย่างนี้:

 byte[] rowvector, colvector, matrix[];

คำประกาศนี้เทียบเท่ากับ:

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

ส่วนตัวเกือบทุกรหัส Java ที่ฉันเคยเห็นการใช้งานรูปแบบครั้งแรกซึ่งทำให้รู้สึกมากขึ้นโดยการเก็บรักษาข้อมูลทั้งหมดที่เกี่ยวกับประเภทตัวแปรในสถานที่หนึ่ง ฉันหวังว่ารูปแบบที่สองจะไม่ได้รับอนุญาตจะซื่อสัตย์ ... แต่นั่นคือชีวิต ...

โชคดีที่ฉันไม่คิดว่าฉันเคยเห็นรหัสนี้ (ถูกต้อง):

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

ขอบคุณฉันเกาหัวของฉันมากกว่านี้ แปลกพอเมื่อ googling ชื่อของคำถามที่ผมพบว่าไม่มีอะไร ...
Yoav

3
+1 ฉันเห็นด้วยกับการไม่อนุญาตแบบฟอร์มที่สอง +1 เกินไปเพราะผมไม่ทราบว่าคุณสามารถผสม 'n' จับคู่เหมือนint[] a[];- ที่ไม่เคยไปได้ไม่ชัดเจน ;-)
โบฮีเมียน


13

ไม่แตกต่าง.

ข้อความจากดวงอาทิตย์ :

[]อาจปรากฏเป็นส่วนหนึ่งของประเภทที่จุดเริ่มต้นของการประกาศหรือเป็นส่วนหนึ่งของ declarator สำหรับตัวแปรโดยเฉพาะอย่างยิ่งหรือทั้งสองเช่นเดียวกับในตัวอย่างนี้byte[] rowvector, colvector, matrix[];

คำประกาศนี้เทียบเท่ากับ: byte rowvector[], colvector[], matrix[][];


11

ไม่มีความแตกต่างระหว่างสองสิ่งนี้ ทั้งประกาศอาร์เรย์ของints อย่างไรก็ตามเป็นที่นิยมมากกว่าเพราะมันเก็บข้อมูลประเภทไว้ในที่เดียว หลังได้รับการสนับสนุนเพื่อประโยชน์ของโปรแกรมเมอร์ C / C ++ เท่านั้นที่ย้ายไปยัง Java


11

ไม่มีความแตกต่างที่แท้จริง อย่างไรก็ตาม

double[] items = new double[10];

เป็นที่ต้องการเนื่องจากมันแสดงให้เห็นอย่างชัดเจนว่าเป็นประเภทอาร์เรย์


1
รายการคู่ [] มันมีสำหรับโปรแกรมเมอร์ซี
สตีฟ Kuo

@ Steve นั่นต้องเป็นสาเหตุที่ฉันทำมันต่อไป :-)
Paul Tomblin

การโต้เถียงสามารถทำให้รายการคู่ [] ระบุประเภทและภายหลังได้อย่างชัดเจนว่ารายการนั้นเกิดขึ้นเป็นอาร์เรย์ - ทั้งหมดขึ้นอยู่กับสิ่งที่คุณพอใจ
MetroidFan2002

7

ทั้งสองมีความถูกต้องเท่าเทียมกัน int puzzle[]รูปแบบเป็นกำลังใจ แต่int[] puzzleเป็นที่ต้องการตามที่การประชุมการเข้ารหัส ดูเพิ่มเติมกวดวิชาอาร์เรย์ Javaอย่างเป็นทางการ:

ในทำนองเดียวกันคุณสามารถประกาศอาร์เรย์ประเภทอื่น ๆ :

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

นอกจากนี้คุณยังสามารถวางวงเล็บเหลี่ยมหลังชื่ออาร์เรย์:

float anArrayOfFloats[]; // this form is discouraged

อย่างไรก็ตามการประชุมทำให้หมดกำลังใจแบบฟอร์มนี้ วงเล็บระบุประเภทอาร์เรย์และควรปรากฏขึ้นพร้อมกับการกำหนดประเภท

หมายเหตุย่อหน้าสุดท้าย

ฉันขอแนะนำให้อ่านบทแนะนำอย่างเป็นทางการของ Sun / Oracle มากกว่าบุคคลที่สาม คุณมีความเสี่ยงที่จะจบลงด้วยการเรียนรู้วิธีปฏิบัติที่ไม่ดี


6

มันเป็นรูปแบบทางเลือกซึ่งยืมมาจาก Cขึ้นอยู่กับจาวา

ในความอยากรู้มีสามวิธีในการกำหนดmainวิธีการที่ถูกต้องใน java:

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

1
ด้วยความเคารพ แต่คำตอบนี้เป็นคำถาม !!!!! เป็นรูปแบบที่สามที่ระบุจริง ๆ แล้วต้องทำอะไรกับสิ่งที่ถูกถามในโพสต์ต้นฉบับ อาร์กิวเมนต์สองตัวแรกคืออาร์เรย์ของวิธีหลักแม้ว่าเอนทิตีที่สามจะเป็นอาร์กิวเมนต์ตัวแปร (ซึ่งไม่เหมือนกับอาร์เรย์) หากการกำหนดวิธีการหลักเป็นคำถามจากนั้นหนึ่งสามารถเพิ่มรูปแบบอื่นเพื่อกำหนดวิธีการหลักเช่นกันเช่นpublic static void main ( String \u005B \u005D args )นี้เป็นตัวแปรอื่นเช่นกัน
nIcE cOw

2
@nIcEcOw varargs พารามิเตอร์เช่นString... param, เป็นอาร์เรย์
โบฮีเมียน

เพียงแค่สงสัยง่ายเกิดขึ้นถ้าทั้งสองมีอาร์เรย์เช่น String [] และสตริง ... , then why it is not possible to call a method like say SomeMethod (1, 2) `หากมีการกำหนดเป็นsomeMethod someMethod ( int[] numbers )อาร์เรย์เรียกร้องให้อาร์กิวเมนต์ต้องมาจากตำแหน่งหน่วยความจำต่อเนื่อง แต่varargsจะสร้างอาร์เรย์จากอาร์กิวเมนต์ที่ให้มาก่อน ยิ่งไปกว่านั้น a varargsสามารถเป็นอาร์กิวเมนต์สุดท้ายของวิธีการได้แม้ว่าจะไม่เป็นความจริงสำหรับอาร์เรย์
nIcE cOw

2
@nIcEcOw แต่คุณสามารถเรียก varargs กับอาร์เรย์คือmeth(int... a)สามารถเรียกว่าเป็นอย่างใดอย่างหนึ่งหรือmeth(1, 2) meth(new int[] {1, 2})Varargs เป็นน้ำตาลประโยคที่เปลี่ยนเวอร์ชั่นแรกเป็นเวอร์ชันที่สอง ชนิดพารามิเตอร์ (bytecode) จริงคือประเภทอาร์เรย์ สำหรับการเป็นคนสุดท้ายถ้าคุณคิดเกี่ยวกับมันไม่มีทางเลือกอื่นที่มีเหตุผล
โบฮีเมียน


3

ตัวเลือกที่ต้องการมากที่สุดคือint[] a- เพราะint[]เป็นประเภทและaเป็นชื่อ (ตัวเลือกที่ 2 ของคุณเหมือนกันกับพื้นที่ที่วางผิดตำแหน่ง)

หน้าที่ไม่มีความแตกต่างระหว่างพวกเขา


3

Java Language ข้อกำหนดพูดว่า:

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

ดังนั้นพวกเขาจะส่งผลให้รหัสไบต์เดียวกัน


2

ใน Java สิ่งเหล่านี้เป็นวิธีการทางวากยสัมพันธ์ที่แตกต่างกันในการพูดสิ่งเดียวกัน



2

พวกเขาจะเทียบเท่าอย่างสมบูรณ์ int [] arrayเป็นสไตล์ที่ต้องการ int array[]มีให้ในลักษณะที่เทียบเท่ากับ C


2

ทั้งสองมีความหมายเหมือนกัน อย่างไรก็ตามการดำรงอยู่ของตัวแปรเหล่านี้ยังช่วยให้:

int[] a, b[];

ซึ่งเหมือนกับ:

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

อย่างไรก็ตามนี่เป็นรูปแบบการเข้ารหัสที่น่ากลัวและไม่ควรทำ


คุณหมายถึงว่า int [] a, b []; b กลายเป็นอาร์เรย์หลายมิติ
sadananda salam

2

ไม่มีความแตกต่างในการทำงานระหว่างทั้งสองลักษณะของการประกาศ ทั้งสองประกาศอาร์เรย์ของ int

แต่int[] a เก็บข้อมูลประเภทไว้ด้วยกันและละเอียดกว่าดังนั้นฉันชอบมันมาก


2

พวกเขาเหมือนกัน แต่มีความแตกต่างที่สำคัญระหว่างข้อความเหล่านี้:

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

ใน 1. regular เป็นเพียง int เท่านั้นเมื่อเทียบกับ 2. โดยที่ทั้ง regular และ array เป็นอาร์เรย์ของ int

ดังนั้นควรเลือกข้อความที่สองที่คุณต้องการเนื่องจากชัดเจนยิ่งขึ้น รูปแบบแรกเป็นกำลังใจยังตามการกวดวิชานี้ใน Oracle


ขอบคุณมาก! ฉันจะไปกับคนที่สองและติดกับมัน
Espen

2

ตามที่ระบุไว้แล้วไม่มีความแตกต่าง (ถ้าคุณประกาศเพียงหนึ่งตัวแปรต่อบรรทัด)

โปรดทราบว่าSonarQubeปฏิบัติต่อกรณีที่สองของคุณเป็นกลิ่นรหัสเล็กน้อย:

ผู้ออกแบบ Array "[]" ควรอยู่ในประเภทไม่ใช่ตัวแปร (squid: S1197)

ผู้ออกแบบอาร์เรย์ควรอยู่ในประเภทเพื่อให้สามารถอ่านรหัสได้ดียิ่งขึ้น มิฉะนั้นผู้พัฒนาจะต้องดูทั้งชนิดและชื่อตัวแปรเพื่อทราบว่าตัวแปรนั้นเป็นอาร์เรย์หรือไม่

ตัวอย่างรหัสที่ไม่สอดคล้อง

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

โซลูชันที่สอดคล้องกับมาตรฐาน

int[][] matrix;   // Compliant

1

ใช่เหมือนกันทุกประการ ส่วนตัวผมชอบ

int[] integers; 

เพราะมันทำให้ชัดเจนทันทีกับทุกคนที่อ่านโค้ดของคุณว่าจำนวนเต็มเป็นอาร์เรย์ของ int

int integers[];

ซึ่งไม่ได้ทำให้ทุกอย่างชัดเจนโดยเฉพาะถ้าคุณมีการประกาศหลายรายการในหนึ่งบรรทัด แต่อีกครั้งพวกเขามีความเท่าเทียมกันดังนั้นจึงขึ้นอยู่กับความชอบส่วนตัว

ลองดูหน้านี้ในอาร์เรย์ใน Javaเพื่อดูตัวอย่างเพิ่มเติมในเชิงลึก


1

เมื่อประกาศการอ้างอิงอาร์เรย์เดียวมีความแตกต่างระหว่างพวกเขาไม่มาก ดังนั้นการประกาศสองข้อต่อไปนี้จึงเหมือนกัน

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

เมื่อประกาศการอ้างอิงหลายอาร์เรย์เราสามารถค้นหาความแตกต่างระหว่างพวกเขา สองข้อความต่อไปนี้มีความหมายเหมือนกัน ในความเป็นจริงมันขึ้นอยู่กับโปรแกรมเมอร์ที่จะติดตาม แต่แนะนำให้ใช้สัญกรณ์ java มาตรฐาน

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


0

ในขณะที่int integers[]วิธีการแก้ปัญหาในภาษา C (และถือได้ว่าเป็นวิธี "ปกติ") หลายคนพบว่าint[] integersมีเหตุผลมากขึ้นเพราะไม่สามารถสร้างตัวแปรประเภทต่าง ๆ (เช่น int และอาร์เรย์) ในการประกาศเดียว (ตรงข้ามกับ การประกาศแบบ C)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.