97


37

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

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

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

1 Answer


194


[Ljava.lang.Object;`は `Object []。class`の名前で、http://download.oracle.com/javase/6/docs/api/java/lang/Class.html [ java .lang.Class`]は `Object`の配列のクラスを表します。

命名スキームはhttp://download.oracle.com/javase/6/docs/api/java/lang/Class.html#getName%28%29 [Class.getName()]に文書化されています。

_ _ このクラスオブジェクトが配列型ではない参照型を表す場合、Java言語仕様(http://java.sun.com/docs/books/jls/third_edition/で指定されているように、クラスのバイナリ名が返されます。 html / binaryComp.html#13.1 [§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]); // [[[[email protected]
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [[email protected]

配列の toString()`メソッドがこの形式で `String`を返す理由は、配列が Object`から継承されたメソッドを `@ Override`しないためです。

_ _ http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28%29 [クラス Object`の toString`メソッド]は、名前で構成される文字列を返しますオブジェクトがインスタンスであるクラス、アットマーク文字「@」、およびオブジェクトのハッシュコードの符号なし16進表現。 つまり、このメソッドは以下の値に等しい文字列を返します。

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

_ _

  • Note *:任意のオブジェクトの toString()`に依存して上記の仕様に従うことはできません。なぜなら、それらは他の何かを返すために `@ Override`を実行できるからです。 任意のオブジェクトのタイプを検査するより信頼性の高い方法は、http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#getClass%28%29 [`getClass( ) `]( Object`から継承された final`メソッド)そして、返された Class`オブジェクトのhttp://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html[reflecting] 。 ただし、理想的には、リフレクションが不要になるようにAPIを設計する必要があります(_Effective Java 2nd Edition、Item 53:Prefer interfaces toreflection_を参照)。

'' '' '

配列のより「有用な」 toString

http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html [java.util.Arrays]は、プリミティブ配列と` Object [] toString`オーバーロードを提供します。 ネストされた配列に使用したい「deepToString」もあります。

ここではいくつかの例を示します。

    int[] nums = { 1, 2, 3 };

    System.out.println(nums);
    // [[email protected]

    System.out.println(Arrays.toString(nums));
    // [1, 2, 3]

    int[][] table = {
            { 1, },
            { 2, 3, },
            { 4, 5, 6, },
    };

    System.out.println(Arrays.toString(table));
    // [[[email protected], [[email protected], [[email protected]]

    System.out.println(Arrays.deepToString(table));
    // [[1], [2, 3], [4, 5, 6]]

また、他の多くの配列関連ユーティリティメソッドの中で、要素によって配列の等価性を比較する「Arrays.equals」と「Arrays.deepEquals」もあります。