web-dev-qa-db-ja.com

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

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

このタイプのエンコーディングとは何ですか?

100
Landon Kuhn

[Ljava.lang.Object;Object[].classの名前で、 Java.lang.ClassObjectの配列のクラスを表します。

命名スキームは 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しないためです。

クラスtoStringObjectメソッド は、オブジェクトがインスタンスであるクラスの名前、アットマーク文字「@」、およびハッシュコードの符号なし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もあります。

関連する質問

199