Was ist das: [Ljava.lang.Object;?

110

Ich erhalte dies, wenn ich toStringein Objekt aufrufe, das ich von einem Funktionsaufruf erhalten habe. Ich weiß, dass der Typ des Objekts in dieser Zeichenfolge codiert ist, aber ich weiß nicht, wie ich es lesen soll.

Wie heißt diese Art der Codierung?

Landon Kuhn
quelle

Antworten:

211

[Ljava.lang.Object;ist der Name für Object[].class, der java.lang.Classdie Klasse des Arrays von darstellt Object.

Das Namensschema ist dokumentiert in Class.getName():

Wenn dieses Klassenobjekt einen Referenztyp darstellt, der kein Array-Typ ist, wird der Binärname der Klasse zurückgegeben, wie in der Java-Sprachspezifikation ( §13.1 ) angegeben.

Wenn dieses Klassenobjekt einen primitiven Typ oder darstellt void, ist der zurückgegebene Name das Java-Sprachschlüsselwort, das dem primitiven Typ oder entspricht void.

Wenn dieses Klassenobjekt eine Klasse von Arrays darstellt, besteht die interne Form des Namens aus dem Namen des Elementtyps, dem ein oder mehrere '['Zeichen vorangestellt sind , die die Tiefe der Array-Verschachtelung darstellen. Die Codierung von Elementtypnamen lautet wie folgt:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

Ihre ist die letzte auf dieser Liste. Hier sind einige Beispiele:

// 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

Der Grund, warum die toString()Methode für Arrays Stringin diesem Format zurückgegeben wird, liegt darin, dass Arrays nicht @Overridedie Methode übernehmen, von der geerbt wurde. Dies Objectwird wie folgt angegeben:

Die toStringMethode für die KlasseObject gibt eine Zeichenfolge zurück, die aus dem Namen der Klasse besteht, für die das Objekt eine Instanz ist, dem Vorzeichen "@" und der hexadezimalen Darstellung des Hash-Codes des Objekts ohne Vorzeichen. Mit anderen Worten, diese Methode gibt eine Zeichenfolge zurück, die dem Wert von:

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

Hinweis : Sie können sich nicht darauf verlassen,toString()dass ein beliebiges Objekt der obigen Spezifikation folgt, da sie es können (und normalerweise tun)@Override, um etwas anderes zurückzugeben. Je zuverlässiger Wegdie Art eines beliebigen Objektsinspizieren ist aufzurufengetClass()darauf (einefinalMethode aus ererbtenObject) und dann reflektiert auf dem zurückClassObjekt. Im Idealfall sollte die API jedoch so konzipiert sein, dass keine Reflexion erforderlich ist (siehe Effective Java 2nd Edition, Punkt 53: Schnittstellen der Reflexion vorziehen ).


Auf einem "nützlicheren" toStringfür Arrays

java.util.Arraysbietet toStringÜberladungen für primitive Arrays und Object[]. Es gibt auch , deepToStringdass Sie für verschachtelten Arrays verwenden mögen.

Hier sind einige Beispiele:

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]]

Es gibt auch Arrays.equalsund Arrays.deepEqualsdiese führen neben vielen anderen Array-bezogenen Dienstprogrammmethoden einen Array-Gleichheitsvergleich durch ihre Elemente durch.

Verwandte Fragen

Polygenschmierstoffe
quelle