関数呼び出しから受け取ったオブジェクトでtoString
を呼び出すと、これを取得します。オブジェクトのタイプがこの文字列にエンコードされていることは知っていますが、どのように読むかわかりません。
このタイプのエンコーディングとは何ですか?
[Ljava.lang.Object;
はObject[].class
の名前で、 Java.lang.Class
はObject
の配列のクラスを表します。
命名スキームは Class.getName()
で文書化されています:
このクラスオブジェクトが配列型ではない参照型を表す場合、Java言語仕様( §13.1 )で指定されているように、クラスのバイナリ名が返されます。
このクラスオブジェクトがプリミティブ型または
void
を表す場合、返される名前は、プリミティブ型またはvoid
に対応するJava言語キーワードです。このクラスオブジェクトが配列のクラスを表す場合、名前の内部形式は、配列の入れ子の深さを表す1つ以上の
'['
文字が前にある要素タイプの名前で構成されます。要素タイプ名のエンコードは次のとおりです。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
を返す理由は、配列がObject
から継承したメソッドを@Override
しないためです。
クラス
toString
のObject
メソッド は、オブジェクトがインスタンスであるクラスの名前、アットマーク文字「@」、およびハッシュコードの符号なし16進表現で構成される文字列を返します。オブジェクト。つまり、このメソッドは次の値に等しい文字列を返します。getClass().getName() + '@' + Integer.toHexString(hashCode())
注:上記の仕様に従うために、任意のオブジェクトのtoString()
に依存することはできません。彼らはそれを@Override
して他の何かを返すことができます(そして通常そうします)。任意のオブジェクトの型を検査するより信頼性の高い方法は、その上で getClass()
(final
から継承されたObject
メソッド)を呼び出してから、返されたClass
オブジェクトで 反映 することです。ただし、理想的には、リフレクションが不要になるようにAPIを設計する必要があります(Effective Java 2nd Edition、Item 53:Prefer interface toreflection) 。
toString
Java.util.Arrays
は、プリミティブ配列とObject[]
のtoString
オーバーロードを提供します。ネストされた配列に使用したい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
もあります。