Ich wollte ein Array erstellen und dessen Inhalt anzeigen.
Drucken Sie das Array so wie es ist
int[] array = {1,2,3,4,5};
System.out.println(array);
Es scheint, dass einige Anfänger überrascht sind, dass das Array als Argument verwendet und an die Standardausgabe übergeben wird. Dieses Ausgabeergebnis (Beispiel) ist
[I@1540e19d
Es wird etwas, das du nicht verstehst. Wenn ich das sehe, werde ich gefragt "Es funktioniert nicht" ... Warum passiert das?
System → java.lang.System-Klasse out → Statische Variable vom Typ PrintStream der Systemklasse Das heißt, println ist eine ** PrintStream-Klassenmethode **. Wenn Sie sich also PrintStream # println ansehen, gibt es einige Überladungen. Die meisten von ihnen sind Überladungen für verschiedene primitive Typen. Wenn Sie also die anderen erwähnen,
println(char[] x) println(Object x) println(String x)
Diese existieren. Diese, einschließlich primitiver Typen, geben eine Reihe von Argumenten aus. Im Fall von char [] werden die Zeichen jedes Elements verbunden und ausgegeben, und String gibt auch den Inhalt so aus, wie er ist.
Im Fall von Object wird ** das Ergebnis der Übergabe des Arguments an String.valueOf
** ausgegeben.
Gibt die Zeichenfolgendarstellung des Object-Arguments zurück. Parameter: obj - Object。 Rückgabewert: Eine Zeichenfolge gleich "null", wenn das Argument null ist. Andernfalls wird der Wert von obj.toString () zurückgegeben.
Der Grund, warum es nicht so wie es ist auf "toString ()" gesetzt ist, ist, dass es null sicher ist.
Was ist also mit dem toString ()
?
Gibt eine Zeichenfolgendarstellung des Objekts zurück. Im Allgemeinen gibt die toString-Methode eine Zeichenfolge zurück, die dieses Objekt "textuell darstellt". Dieses Ergebnis sollte präzise und informativ für die menschliche Lesbarkeit sein. Oracle empfiehlt, diese Methode in allen Unterklassen zu überschreiben. Die toString-Methode der Klasse Object gibt eine Zeichenfolge zurück, die aus dem Namen der ursprünglichen Klasse, in der das Objekt eine Instanz ist, dem atmark-Zeichen "@" und einer vorzeichenlosen hexadezimalen Darstellung des Hash-Codes des Objekts besteht. Das heißt, diese Methode gibt eine Zeichenfolge zurück, die den folgenden Werten entspricht:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Rückgabewert: Eine Zeichenfolgendarstellung dieses Objekts.
Es ist geworden. Schauen wir uns hier die erste Ausgabe an.
[I@1540e19d
Verstehst du? Die Zeichenfolge nach diesem @ ist das Ergebnis von "Integer.toHexString (hashCode ())", dh ** der hexadezimalen Notation des Hash-Codes **. Diese Zahl ist jedoch für den Menschen bedeutungslos.
In der Beschreibung der Methode heißt es: "Dieses Ergebnis sollte präzise und nützliche Informationen sein, die Menschen lesen können. Es wird empfohlen, diese Methode in allen Unterklassen zu überschreiben." Dies ist die ursprüngliche Verwendung der Methode. In der Basisklasse Object wird nur entschieden, dass "wenn es vorerst aufgerufen wird, wird es so ausgegeben", und ** es gibt keine Informationen über den Inhalt **.
Wenn es nur eine nützliche Information gibt, ist es die Zeichenfolge ** vor ** @. In diesem Beispiel ist es "[I". Was ist das ...? Wenn Sie so denken, lesen Sie die Erklärung noch einmal. Die Zeichenfolge vor dem @, die das Ergebnis von "getClass (). GetName ()" ist. Welche Art von Spezifikationen haben Sie?
Es ist schwierig, den Rückgabetyp Class of getClass () im Detail zu erklären oder zu verstehen. Daher möchte ich, dass Sie ihn vorerst als "Objekt erkennen, das eine Instanz welcher Klasse darstellt".
Gibt den Namen der Entität (Klasse, Schnittstelle, Array-Klasse, primitiver Typ oder void) zurück, die von diesem Class-Objekt als String dargestellt wird. Wenn dieses Klassenobjekt einen Referenztyp vom Typ ohne Array darstellt, wie in der Java (tm) -Sprachenspezifikation angegeben, wird der Binärname der Klasse zurückgegeben.
Wenn dieses Klassenobjekt einen primitiven Typ oder eine Leere darstellt, ist der zurückgegebene Name eine Zeichenfolge, die dem Java-Sprachschlüsselwort entspricht, das dem primitiven Typ oder der Leere entspricht.
Wenn dieses Klassenobjekt eine Klasse eines Arrays darstellt, besteht die interne Form des Namens aus einem oder mehreren [Zeichen, dem Namen des Elementtyps, der die Verschachtelungstiefe des Arrays darstellt. Die Codierung des Elementtypnamens lautet wie folgt:
Elementtypcodierung Boolescher Typ Z. byte B char C Klasse oder Schnittstelle Lclassname; double D float F int I long J short S Der Klassenname des Klassennamens oder des Schnittstellennamens wird wie im obigen Beispiel durch den Binärnamen der Klasse angegeben.
Beispiel
String.class.getName() returns "java.lang.String" byte.class.getName() returns "byte" (new Object[3]).getClass().getName() returns "[Ljava.lang.Object;" (new int[3][4][5][6][7][8][9]).getClass().getName() returns "[[[[[[[I"
Einfach ausgedrückt ist es eine Zeichenfolge, die den Typ der Instanz darstellt.
Bitte beachten Sie den Fall der Absprache. Das Format ist so, dass [
durch die Anzahl der Dimensionen des Arrays gefolgt vom Klassennamen ausgerichtet wird (L wird eingefügt, wenn es kein Grundelement ist).
Im Fall des Endes des Beispiels sind, da das Array 7-dimensional ist, 7 "[" angeordnet, gefolgt von I, was anzeigt, dass es ein int-Array ist.
Mit anderen Worten, [I
drückte aus, dass dieses Objekt ein eindimensionales int-Array ist.
Wie oben erwähnt, wurde die erste scheinbar unverständliche Ausgabe gemäß den Spezifikationen ausgegeben. Gehen Sie nicht davon aus, dass es sich um einen Fehler handelt, nur weil es sich um eine bedeutungslose Zeichenfolge handelt, sondern untersuchen Sie das ursprüngliche Verhalten ordnungsgemäß. Wenn Sie den Inhalt des Arrays ordnungsgemäß ausgeben möchten, übergeben Sie ihn übrigens an Arrays.toString () (Arrays.deepToString () für ein mehrdimensionales Array), um ihn in einen String umzuwandeln, oder geben Sie ihn mithilfe einer Schleife aus.
Recommended Posts