ฉันเพิ่งคิดเกี่ยวกับความแตกต่างระหว่างสองวิธีในการกำหนดอาร์เรย์:
int[] array
int array[]
มีความแตกต่างหรือไม่?
ฉันเพิ่งคิดเกี่ยวกับความแตกต่างระหว่างสองวิธีในการกำหนดอาร์เรย์:
int[] array
int array[]
มีความแตกต่างหรือไม่?
คำตอบ:
พวกมันเหมือนกันทางความหมาย เพิ่มint array[]
ไวยากรณ์เพื่อช่วยให้โปรแกรมเมอร์ C คุ้นเคยกับจาวาเท่านั้น
int[] array
เป็นที่นิยมมากกว่าและสับสนน้อยกว่า
int array[]
ไวยากรณ์ ยังมีเหตุผล ... ในทางที่บิดเบี้ยว :)
int array[]
ทำให้รู้สึกถึงฉันมากขึ้น คุณคิดอย่างไรเกี่ยวกับคำประกาศนี้ int[] x, y
? คือy
อาร์เรย์หรือไม่? บางทีมันอาจจะไม่ใช่หรือ เฉพาะกูรูของจาวาเท่านั้นที่สามารถตอบได้อย่างมั่นใจ ....
int[] x, y
, y
คืออาร์เรย์ (เพราะ[]
เป็นของชนิด), และในกรณีของint x[], y
, y
ไม่ใช่อาร์เรย์ ( []
เป็นของตัวแปร)
มีความแตกต่างเล็กน้อยหนึ่งอย่างถ้าคุณประกาศตัวแปรมากกว่าหนึ่งตัวในการประกาศเดียวกัน:
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
โปรดทราบว่านี้ไม่ดีรูปแบบการเข้ารหัสแม้ว่าคอมไพเลอร์เกือบจะแน่นอนจะจับข้อผิดพลาดของคุณในขณะที่คุณพยายามที่จะใช้
ไม่มีความแตกต่าง
ฉันชอบ type[] name
รูปแบบที่ชัดเจนว่าตัวแปรเป็นอาร์เรย์ (มองไปรอบ ๆ น้อยลงเพื่อค้นหาว่ามันคืออะไร)
แก้ไข:
โอ้รอมีความแตกต่าง (ฉันลืมเพราะฉันไม่เคยประกาศตัวแปรมากกว่าหนึ่งครั้ง):
int[] foo, bar; // both are arrays
int foo[], bar; // foo is an array, bar is an int.
ไม่พวกมันเหมือนกัน อย่างไรก็ตาม
byte[] rowvector, colvector, matrix[];
เทียบเท่ากับ:
byte rowvector[], colvector[], matrix[][];
ที่นำมาจากJava ข้อมูลจำเพาะ นั่นหมายความว่า
int a[],b;
int[] a,b;
แตกต่าง. ฉันจะไม่แนะนำการประกาศหลายอย่างใดอย่างหนึ่งเหล่านี้ ง่ายที่สุดในการอ่าน (อาจ) เป็น:
int[] a;
int[] b;
จากส่วนที่ 10.2 ของข้อกำหนดภาษา Java :
[] อาจปรากฏขึ้นเป็นส่วนหนึ่งของประเภทที่จุดเริ่มต้นของการประกาศหรือเป็นส่วนหนึ่งของผู้ประกาศสำหรับตัวแปรเฉพาะหรือทั้งสองอย่างเช่นในตัวอย่างนี้:
byte[] rowvector, colvector, matrix[];
คำประกาศนี้เทียบเท่ากับ:
byte rowvector[], colvector[], matrix[][];
ส่วนตัวเกือบทุกรหัส Java ที่ฉันเคยเห็นการใช้งานรูปแบบครั้งแรกซึ่งทำให้รู้สึกมากขึ้นโดยการเก็บรักษาข้อมูลทั้งหมดที่เกี่ยวกับประเภทตัวแปรในสถานที่หนึ่ง ฉันหวังว่ารูปแบบที่สองจะไม่ได้รับอนุญาตจะซื่อสัตย์ ... แต่นั่นคือชีวิต ...
โชคดีที่ฉันไม่คิดว่าฉันเคยเห็นรหัสนี้ (ถูกต้อง):
String[] rectangular[] = new String[10][10];
int[] a[];
- ที่ไม่เคยไปได้ไม่ชัดเจน ;-)
คำสั่งสองคำนั้นเหมือนกัน
คุณสามารถใช้ไวยากรณ์เพื่อประกาศหลายวัตถุ:
int[] arrayOne, arrayTwo; //both arrays
int arrayOne[], intOne; //one array one int
ดู: http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
ไม่แตกต่าง.
ข้อความจากดวงอาทิตย์ :
[]
อาจปรากฏเป็นส่วนหนึ่งของประเภทที่จุดเริ่มต้นของการประกาศหรือเป็นส่วนหนึ่งของ declarator สำหรับตัวแปรโดยเฉพาะอย่างยิ่งหรือทั้งสองเช่นเดียวกับในตัวอย่างนี้byte[] rowvector, colvector, matrix[];
คำประกาศนี้เทียบเท่ากับ:
byte rowvector[], colvector[], matrix[][];
ไม่มีความแตกต่างระหว่างสองสิ่งนี้ ทั้งประกาศอาร์เรย์ของint
s อย่างไรก็ตามเป็นที่นิยมมากกว่าเพราะมันเก็บข้อมูลประเภทไว้ในที่เดียว หลังได้รับการสนับสนุนเพื่อประโยชน์ของโปรแกรมเมอร์ C / C ++ เท่านั้นที่ย้ายไปยัง Java
ไม่มีความแตกต่างที่แท้จริง อย่างไรก็ตาม
double[] items = new double[10];
เป็นที่ต้องการเนื่องจากมันแสดงให้เห็นอย่างชัดเจนว่าเป็นประเภทอาร์เรย์
ทั้งสองมีความถูกต้องเท่าเทียมกัน 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 มากกว่าบุคคลที่สาม คุณมีความเสี่ยงที่จะจบลงด้วยการเรียนรู้วิธีปฏิบัติที่ไม่ดี
มันเป็นรูปแบบทางเลือกซึ่งยืมมาจาก C
ขึ้นอยู่กับจาวา
ในความอยากรู้มีสามวิธีในการกำหนดmain
วิธีการที่ถูกต้องใน java:
public static void main(String[] args)
public static void main(String args[])
public static void main(String... args)
public static void main ( String \u005B \u005D args )
นี้เป็นตัวแปรอื่นเช่นกัน
String... param
, เป็นอาร์เรย์
, then why it is not possible to call a method like say
SomeMethod (1, 2) `หากมีการกำหนดเป็นsomeMethod
someMethod ( int[] numbers )
อาร์เรย์เรียกร้องให้อาร์กิวเมนต์ต้องมาจากตำแหน่งหน่วยความจำต่อเนื่อง แต่varargs
จะสร้างอาร์เรย์จากอาร์กิวเมนต์ที่ให้มาก่อน ยิ่งไปกว่านั้น a varargs
สามารถเป็นอาร์กิวเมนต์สุดท้ายของวิธีการได้แม้ว่าจะไม่เป็นความจริงสำหรับอาร์เรย์
meth(int... a)
สามารถเรียกว่าเป็นอย่างใดอย่างหนึ่งหรือmeth(1, 2)
meth(new int[] {1, 2})
Varargs เป็นน้ำตาลประโยคที่เปลี่ยนเวอร์ชั่นแรกเป็นเวอร์ชันที่สอง ชนิดพารามิเตอร์ (bytecode) จริงคือประเภทอาร์เรย์ สำหรับการเป็นคนสุดท้ายถ้าคุณคิดเกี่ยวกับมันไม่มีทางเลือกอื่นที่มีเหตุผล
ไม่มีความแตกต่าง แต่ซันแนะนำให้วางไว้ถัดจากประเภทตามที่อธิบายไว้ที่นี่
ตัวเลือกที่ต้องการมากที่สุดคือint[] a
- เพราะint[]
เป็นประเภทและa
เป็นชื่อ (ตัวเลือกที่ 2 ของคุณเหมือนกันกับพื้นที่ที่วางผิดตำแหน่ง)
หน้าที่ไม่มีความแตกต่างระหว่างพวกเขา
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[][];
ดังนั้นพวกเขาจะส่งผลให้รหัสไบต์เดียวกัน
ใน Java สิ่งเหล่านี้เป็นวิธีการทางวากยสัมพันธ์ที่แตกต่างกันในการพูดสิ่งเดียวกัน
พวกเขาเหมือนกัน หนึ่งสามารถอ่านได้ (บาง) มากกว่าอื่น ๆ
พวกเขาจะเทียบเท่าอย่างสมบูรณ์ int [] array
เป็นสไตล์ที่ต้องการ int array[]
มีให้ในลักษณะที่เทียบเท่ากับ C
ทั้งสองมีความหมายเหมือนกัน อย่างไรก็ตามการดำรงอยู่ของตัวแปรเหล่านี้ยังช่วยให้:
int[] a, b[];
ซึ่งเหมือนกับ:
int[] a;
int[][] b;
อย่างไรก็ตามนี่เป็นรูปแบบการเข้ารหัสที่น่ากลัวและไม่ควรทำ
ไม่มีความแตกต่างในการทำงานระหว่างทั้งสองลักษณะของการประกาศ ทั้งสองประกาศอาร์เรย์ของ int
แต่int[] a
เก็บข้อมูลประเภทไว้ด้วยกันและละเอียดกว่าดังนั้นฉันชอบมันมาก
พวกเขาเหมือนกัน แต่มีความแตกต่างที่สำคัญระหว่างข้อความเหล่านี้:
// 1.
int regular, array[];
// 2.
int[] regular, array;
ใน 1. regular เป็นเพียง int เท่านั้นเมื่อเทียบกับ 2. โดยที่ทั้ง regular และ array เป็นอาร์เรย์ของ int
ดังนั้นควรเลือกข้อความที่สองที่คุณต้องการเนื่องจากชัดเจนยิ่งขึ้น รูปแบบแรกเป็นกำลังใจยังตามการกวดวิชานี้ใน Oracle
ตามที่ระบุไว้แล้วไม่มีความแตกต่าง (ถ้าคุณประกาศเพียงหนึ่งตัวแปรต่อบรรทัด)
โปรดทราบว่าSonarQubeปฏิบัติต่อกรณีที่สองของคุณเป็นกลิ่นรหัสเล็กน้อย:
ผู้ออกแบบ Array "[]" ควรอยู่ในประเภทไม่ใช่ตัวแปร (squid: S1197)
ผู้ออกแบบอาร์เรย์ควรอยู่ในประเภทเพื่อให้สามารถอ่านรหัสได้ดียิ่งขึ้น มิฉะนั้นผู้พัฒนาจะต้องดูทั้งชนิดและชื่อตัวแปรเพื่อทราบว่าตัวแปรนั้นเป็นอาร์เรย์หรือไม่
ตัวอย่างรหัสที่ไม่สอดคล้อง
int matrix[][]; // Noncompliant int[] matrix[]; // Noncompliant
โซลูชันที่สอดคล้องกับมาตรฐาน
int[][] matrix; // Compliant
ใช่เหมือนกันทุกประการ ส่วนตัวผมชอบ
int[] integers;
เพราะมันทำให้ชัดเจนทันทีกับทุกคนที่อ่านโค้ดของคุณว่าจำนวนเต็มเป็นอาร์เรย์ของ int
int integers[];
ซึ่งไม่ได้ทำให้ทุกอย่างชัดเจนโดยเฉพาะถ้าคุณมีการประกาศหลายรายการในหนึ่งบรรทัด แต่อีกครั้งพวกเขามีความเท่าเทียมกันดังนั้นจึงขึ้นอยู่กับความชอบส่วนตัว
ลองดูหน้านี้ในอาร์เรย์ใน Javaเพื่อดูตัวอย่างเพิ่มเติมในเชิงลึก
เมื่อประกาศการอ้างอิงอาร์เรย์เดียวมีความแตกต่างระหว่างพวกเขาไม่มาก ดังนั้นการประกาศสองข้อต่อไปนี้จึงเหมือนกัน
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
ทั้งคู่ก็โอเค ฉันแนะนำให้เลือกและติดกับมัน (ฉันทำอย่างที่สอง)
ในขณะที่int integers[]
วิธีการแก้ปัญหาในภาษา C (และถือได้ว่าเป็นวิธี "ปกติ") หลายคนพบว่าint[] integers
มีเหตุผลมากขึ้นเพราะไม่สามารถสร้างตัวแปรประเภทต่าง ๆ (เช่น int และอาร์เรย์) ในการประกาศเดียว (ตรงข้ามกับ การประกาศแบบ C)