回答:
[Ljava.lang.Object;
の名前でObject[].class
、java.lang.Class
の配列のクラスを表しObject
ます。
命名スキームは次のドキュメントに記載されていClass.getName()
ます。
このクラスオブジェクトが配列型ではない参照型を表す場合、Java言語仕様(§13.1)で指定されているように、クラスのバイナリ名が返されます。
このクラスオブジェクトがプリミティブ型orを表す場合
void
、返される名前はプリミティブ型orに対応するJava言語のキーワードvoid
です。このクラスオブジェクトが配列のクラスを表す場合、名前の内部形式
'['
は、配列のネストの深さを表す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
がこの形式で返されるのは、配列が@Override
から継承されたメソッドではないためですObject
。これは、次のように指定されます。
toString
classObject
のメソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表記で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。getClass().getName() + '@' + Integer.toHexString(hashCode())
注:toString()
上記の仕様に従うために任意のオブジェクトのに依存することはできませ@Override
ん。これは、他の何かを返すために(そして通常は)実行できるためです。任意のオブジェクトのタイプを検査するより信頼性の高い方法は、そのオブジェクトgetClass()
(final
から継承されたメソッドObject
)を呼び出し、返されたオブジェクトを反映するClass
ことです。ただし、理想的には、リフレクションが不要になるようにAPIを設計する必要があります(効果的なJava 2nd Edition、アイテム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
配列に関連するユーティリティメソッドが数多くありますが、それらの要素による配列の等価比較が行われます。