これは何ですか:[Ljava.lang.Object ;?


110

これtoStringは、関数呼び出しから受け取ったオブジェクトを呼び出すと発生します。オブジェクトのタイプがこの文字列にエンコードされていることは知っていますが、それを読み取る方法がわかりません。

このタイプのエンコーディングは何と呼ばれますか?

回答:


211

[Ljava.lang.Object;の名前でObject[].classjava.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。これは、次のように指定されます。

toStringclassObjectメソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表記で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。

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

toString()上記の仕様に従うために任意のオブジェクトのに依存することはできませ@Overrideん。これは、他の何かを返すために(そして通常は)実行できるためです。任意のオブジェクトのタイプを検査するより信頼性の高い方法は、そのオブジェクトgetClass()finalから継承されたメソッドObject)を呼び出し、返されたオブジェクトを反映するClassことです。ただし、理想的には、リフレクションが不要になるようにAPIを設計する必要があります(効果的なJava 2nd Edition、アイテム53:リフレクションへのインターフェースを優先するを参照)。


toString配列にとってより「役に立つ」

java.util.ArraystoStringプリミティブ配列とのオーバーロードを提供します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.equalsArrays.deepEquals配列に関連するユーティリティメソッドが数多くありますが、それらの要素による配列の等価比較が行われます。

関連する質問

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.