ฉันได้รับสิ่งนี้เมื่อฉันเรียกtoString
วัตถุที่ได้รับจากการเรียกใช้ฟังก์ชัน ฉันรู้ว่าประเภทของวัตถุถูกเข้ารหัสในสตริงนี้ แต่ฉันไม่รู้วิธีอ่าน
การเข้ารหัสประเภทนี้เรียกว่าอะไร?
ฉันได้รับสิ่งนี้เมื่อฉันเรียกtoString
วัตถุที่ได้รับจากการเรียกใช้ฟังก์ชัน ฉันรู้ว่าประเภทของวัตถุถูกเข้ารหัสในสตริงนี้ แต่ฉันไม่รู้วิธีอ่าน
การเข้ารหัสประเภทนี้เรียกว่าอะไร?
คำตอบ:
[Ljava.lang.Object;
เป็นชื่อObject[].class
ที่เป็นตัวแทนระดับของอาร์เรย์ของjava.lang.Class
Object
รูปแบบการตั้งชื่อมีการบันทึกไว้ในClass.getName()
:
ถ้าคลาสออบเจ็กต์นี้แสดงถึงชนิดการอ้างอิงที่ไม่ใช่ประเภทอาร์เรย์ชื่อไบนารีของคลาสจะถูกส่งกลับตามที่ระบุโดยข้อกำหนดภาษา Java ( §13.1 )
ถ้าวัตถุชั้นนี้หมายถึงชนิดดั้งเดิมหรือ
void
แล้วชื่อกลับเป็นภาษา Javavoid
คำหลักที่สอดคล้องกับประเภทดั้งเดิมหรือถ้าคลาสออบเจ็กต์นี้แสดงถึงคลาสของอาร์เรย์รูปแบบภายในของชื่อจะประกอบด้วยชื่อของประเภทองค์ประกอบที่นำหน้าด้วย
'['
อักขระอย่างน้อยหนึ่งตัวที่แสดงความลึกของอาร์เรย์ที่ซ้อนกัน การเข้ารหัสชื่อประเภทองค์ประกอบมีดังนี้:Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
ของคุณคือคนสุดท้ายในรายการนั้น นี่คือตัวอย่างบางส่วน:
// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx
สาเหตุที่toString()
เมธอดบนอาร์เรย์ส่งคืนString
ในรูปแบบนี้เนื่องจากอาร์เรย์ไม่ใช่@Override
วิธีที่สืบทอดมาObject
ซึ่งระบุไว้ดังนี้:
toString
วิธีการสำหรับการเรียนObject
ส่งกลับสตริงประกอบด้วยชื่อของคลาสซึ่งวัตถุที่เป็นเช่นที่ป้ายตัวอักษร `@' และการแสดงที่ไม่ได้ลงชื่อเลขฐานสิบหกรหัสกัญชาของวัตถุ กล่าวอีกนัยหนึ่งวิธีนี้จะส่งคืนสตริงที่เท่ากับค่าของ:getClass().getName() + '@' + Integer.toHexString(hashCode())
หมายเหตุ : คุณไม่สามารถพึ่งพาtoString()
วัตถุตามอำเภอใจใด ๆ เพื่อทำตามข้อกำหนดข้างต้นเนื่องจากสามารถ (และโดยปกติจะทำ)@Override
เพื่อส่งคืนสิ่งอื่น วิธีที่เชื่อถือได้มากขึ้นในการตรวจสอบประเภทของวัตถุโดยพลการคือการเรียกใช้getClass()
(final
วิธีการที่สืบทอดมาObject
) จากนั้นสะท้อนไปที่Class
วัตถุที่ส่งคืน ตามหลักการแล้ว API ควรได้รับการออกแบบมาเพื่อให้ไม่จำเป็นต้องมีการสะท้อนกลับ (ดู Effective Java 2nd Edition, Item 53: ชอบอินเทอร์เฟซสำหรับการสะท้อนแสง )
toString
สำหรับอาร์เรย์java.util.Arrays
ให้toString
โอเวอร์โหลดสำหรับอาร์เรย์ดั้งเดิมและObject[]
. นอกจากนี้deepToString
คุณอาจต้องการใช้สำหรับอาร์เรย์ที่ซ้อนกัน
นี่คือตัวอย่างบางส่วน:
int[] nums = { 1, 2, 3 };
System.out.println(nums);
// [I@xxxxx
System.out.println(Arrays.toString(nums));
// [1, 2, 3]
int[][] table = {
{ 1, },
{ 2, 3, },
{ 4, 5, 6, },
};
System.out.println(Arrays.toString(table));
// [[I@xxxxx, [I@yyyyy, [I@zzzzz]
System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]
นอกจากนี้ยังมีArrays.equals
และArrays.deepEquals
ทำการเปรียบเทียบความเท่าเทียมกันของอาร์เรย์โดยองค์ประกอบของพวกมันรวมถึงวิธียูทิลิตี้อื่น ๆ ที่เกี่ยวข้องกับอาร์เรย์