Saya mendapatkan ini ketika saya memanggil toString
objek 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?
[Ljava.lang.Object;
adalah nama untuk Object[].class
, java.lang.Class
mewakili 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 atauvoid
.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 String
dalam format ini adalah karena array bukan @Override
metode yang diwarisi Object
, yang ditentukan sebagai berikut:
The
toString
metode 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)@Override
untuk mengembalikan sesuatu yang lain. Cara yang lebih dapat diandalkan untuk memeriksa jenis objek arbitrer adalah dengan memanggilnyagetClass()
(final
metode 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 ).
toString
untuk arrayjava.util.Arrays
menyediakan toString
kelebihan beban untuk array primitif dan Object[]
. Ada juga deepToString
yang 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.equals
danArrays.deepEquals
yang melakukan berbagai kesetaraan perbandingan oleh unsur-unsur mereka, di antara banyak metode utilitas terkait array lainnya.