ฉันเพิ่งคิดเกี่ยวกับความแตกต่างระหว่างสองวิธีในการกำหนดอาร์เรย์:
int[] arrayint array[]
มีความแตกต่างหรือไม่?
ฉันเพิ่งคิดเกี่ยวกับความแตกต่างระหว่างสองวิธีในการกำหนดอาร์เรย์:
int[] arrayint 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[][];
ไม่มีความแตกต่างระหว่างสองสิ่งนี้ ทั้งประกาศอาร์เรย์ของints อย่างไรก็ตามเป็นที่นิยมมากกว่าเพราะมันเก็บข้อมูลประเภทไว้ในที่เดียว หลังได้รับการสนับสนุนเพื่อประโยชน์ของโปรแกรมเมอร์ 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)