[JAVA] Die Geschichte von toString () beginnt mit der Übergabe eines Arrays an System.out.println

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?

Was ist System.out.println?

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.

String.valueOf(Object)

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 ()?

Object#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 **.

Die Zeichenfolge vor der @ -what-Objektklasse?

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".

Class#getName

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

Die Geschichte von toString () beginnt mit der Übergabe eines Arrays an System.out.println
Anfordern durch Übergeben eines Arrays an eine Abfrage mit dem HTTP-Client von Ruby
So konvertieren Sie ein Array von Strings mit der Stream-API in ein Array von Objekten
Eine Geschichte, die von String () von Interface abhängig ist und von JdkDynamicAopProxy vertreten wird
Versuchen Sie, die Idee eines zweidimensionalen Arrays mit einem eindimensionalen Array nachzuahmen
[Swift5] So erhalten Sie ein Array und eine Reihe von Unterschieden zwischen Arrays
Eine Geschichte über die Verbindung zu einem CentOS 8-Server mit einem alten Ansible
Vergleichen Sie Elemente eines Arrays (Java)
Konvertieren Sie ein Array von Zeichenfolgen in Zahlen
Rufen Sie den Typ eines Elements eines Arrays ab, um festzustellen, ob es sich um ein Array handelt
Die Geschichte der Einführung der Ajax-Kommunikation in Ruby
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Die Geschichte der Optimierung der Android-App mit libGDX
Die Geschichte des Hinzufügens der neuesten Node.js zu DockerFile
[Swift] So ermitteln Sie die Anzahl der Elemente in einem Array (Super Basic)
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
Geschwindigkeitsvergleich, wenn die Werteseite von Hash alles mit Array abrufen möchte
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
Testen Sie den Inhalt einer Excel-Datei mit JUnit
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
Die Geschichte einer illegalen staatlichen Ausnahme in Jetty.
Bearbeiten Sie Pixel, um ein Bild eines Mandelbrot-Sets zu erstellen
Die Geschichte von dto, dao-like mit Java, SQLite
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
So rufen Sie den Hashwert in einem Array in Ruby ab
Initialisierung mit einer leeren Zeichenfolge für eine Instanz vom Typ Java-Zeichenfolge
Hinzufügen von Elementen ohne Angabe der Länge des Arrays
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
[Apache Tomcat] Die Geschichte der Verwendung von Apache OpenWebBeans zum Aktivieren von CDI
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)
Eine Geschichte über die Bekämpfung der Ubuntu-Fehler 0x80370114 und 0x80000000, um den Docker-Desktop mit wsl2 in Windows 10 Home zu aktivieren
Die Geschichte des Refactorings mit einem selbstgemachten Helfer zum ersten Mal in einer Rails-App
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Verwandeln Sie ein Array von Strings in eine Liste von Ganzzahlen in Java
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
So ermitteln Sie die Länge einer Audiodatei mit Java
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Die Geschichte der Einführung von Gradle als Nachrüstung eines bestehenden Systems, das keine Pakete verwaltet
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
[Java Edition] Geschichte der Serialisierung
Die Geschichte von Java Gold SE8
Die Geschichte von @ViewScoped, die Speicher verschlingt
So dekorieren Sie CSS auf Rails6 form_with (Hilfs-) Optionsfeldern
[Swift] Zusammenfassung zum Löschen von Elementen aus einem Array (persönliches Memo)
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
[Java] So drehen Sie ein zweidimensionales Array mit einer erweiterten for-Anweisung
Die Geschichte des Wechsels von Amazon RDS für MySQL zu Amazon Aurora Serverless
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu