Apa ini: [Ljava.lang.Object ;?

110

Saya mendapatkan ini ketika saya memanggil toStringobjek yang saya terima dari panggilan fungsi. Saya tahu jenis objek yang dikodekan dalam string ini, tetapi saya tidak tahu cara membacanya.

Apa nama jenis pengkodean ini?

Landon Kuhn
sumber

Jawaban:

211

[Ljava.lang.Object;adalah nama untuk Object[].class, java.lang.Classmewakili kelas dari array Object.

Skema penamaan didokumentasikan di Class.getName():

Jika objek kelas ini mewakili tipe referensi yang bukan tipe larik maka nama biner kelas akan dikembalikan, seperti yang ditentukan oleh Spesifikasi Bahasa Java ( §13.1 ).

Jika objek kelas ini mewakili tipe primitif atau void, maka nama yang dikembalikan adalah kata kunci bahasa Java yang sesuai dengan tipe primitif atau void.

Jika objek kelas ini mewakili kelas larik, maka bentuk internal namanya terdiri dari nama jenis elemen yang diawali dengan satu atau lebih '['karakter yang mewakili kedalaman penumpukan larik. Pengkodean nama jenis elemen adalah sebagai berikut:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

Milik Anda adalah yang terakhir dalam daftar itu. Berikut beberapa contohnya:

// 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

Alasan mengapa toString()metode pada array kembali Stringdalam format ini adalah karena array bukan @Overridemetode yang diwarisi Object, yang ditentukan sebagai berikut:

The toStringmetode untuk kelasObject mengembalikan sebuah string yang terdiri dari nama kelas yang objek adalah sebuah contoh, karakter di-tanda `@', dan heksadesimal representasi unsigned kode hash objek. Dengan kata lain, metode ini mengembalikan string yang sama dengan nilai:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Catatan : Anda tidak dapat bergantung padatoString()sembarang objek untuk mengikuti spesifikasi di atas, karena mereka dapat (dan biasanya melakukannya)@Overrideuntuk mengembalikan sesuatu yang lain. Cara yang lebih dapat diandalkan untuk memeriksa jenis objek arbitrer adalah dengan memanggilnyagetClass()(finalmetode yang diwarisi dariObject) dan kemudian merefleksikanClass objek yangdikembalikan. Idealnya, API harus dirancang sedemikian rupa sehingga refleksi tidak diperlukan (lihat Efektif Java 2nd Edition, Item 53: Lebih suka antarmuka untuk refleksi ).


Lebih "berguna" toStringuntuk array

java.util.Arraysmenyediakan toStringkelebihan beban untuk array primitif dan Object[]. Ada juga deepToStringyang mungkin ingin Anda gunakan untuk array bersarang.

Berikut beberapa contohnya:

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

Ada juga Arrays.equalsdanArrays.deepEquals yang melakukan berbagai kesetaraan perbandingan oleh unsur-unsur mereka, di antara banyak metode utilitas terkait array lainnya.

Pertanyaan-pertanyaan Terkait

poligenelubricants
sumber