[JAVA] L'histoire de toString () commençant par le passage d'un tableau à System.out.println

Je voulais faire un tableau et afficher son contenu,

Imprimez le tableau tel quel


int[] array = {1,2,3,4,5};
System.out.println(array);

Il semble que certains débutants soient surpris de voir que le tableau est utilisé comme argument et passé à la sortie standard. Ce résultat de sortie (exemple) est

[I@1540e19d

Cela devient quelque chose que vous ne comprenez pas. Quand je vois ça, on me demande "ça ne marche pas" ... Pourquoi cela arrive-t-il?

Qu'est-ce que System.out.println?

Système → classe java.lang.System out → Variable statique de type PrintStream de la classe System Autrement dit, println est une ** méthode de classe PrintStream **. Donc, si vous regardez PrintStream # println, il y a des surcharges. La plupart d'entre eux sont surchargés pour prendre en charge divers types primitifs, donc pour citer les autres,

println(char[] x) println(Object x) println(String x)

Celles-ci existent. Ceux-ci, y compris les types primitifs, génèrent une chaîne d'arguments. Dans le cas de char [], les caractères de chaque élément sont connectés et sortis, et String sort également le contenu tel quel.

Dans le cas d'Object, ** le résultat du passage de l'argument à String.valueOf ** est affiché.

String.valueOf(Object)

Renvoie la représentation sous forme de chaîne de l'argument Object. Paramètres: obj - Object。 Valeur de retour: Une chaîne égale à "null" si l'argument est nul. Sinon, la valeur de obj.toString () est renvoyée.

La raison pour laquelle il n'est pas défini sur toString () tel quel est parce qu'il est nullement sûr. Alors qu'en est-il de toString ()?

Object#toString

Renvoie une représentation sous forme de chaîne de l'objet. En général, la méthode toString renvoie une chaîne qui "représente textuellement" cet objet. Ce résultat doit être concis et informatif pour la lisibilité humaine. Oracle vous recommande de remplacer cette méthode dans toutes les sous-classes. La méthode toString de la classe Object renvoie une chaîne composée du nom de la classe d'origine dans laquelle l'objet est une instance, du caractère atmark "@" et d'une représentation hexadécimale non signée du code de hachage de l'objet. Autrement dit, cette méthode renvoie une chaîne égale aux valeurs suivantes:

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

Valeur de retour: Une représentation sous forme de chaîne de cet objet.

Il est devenu. Jetons un coup d'œil à la première sortie ici.

[I@1540e19d

Comprenez vous? La chaîne après ce @ est le résultat de ʻInteger.toHexString (hashCode ()) `, c'est-à-dire ** la notation hexadécimale du code de hachage **. Cependant, ce nombre n'a aucun sens pour les humains.

Comme l'indique la description de la méthode, "Ce résultat doit être une information concise et utile que les humains peuvent lire. Il est recommandé de remplacer cette méthode dans toutes les sous-classes." Il s'agit de l'utilisation originale de la méthode. Dans la classe de base Object, il est seulement décidé que "s'il est appelé pour le moment, il sera affiché comme ceci", et ** il n'y a aucune information sur le contenu **.

La chaîne avant le @ -quelle classe d'objet?

S'il n'y a qu'une seule information utile, c'est la chaîne ** avant ** @. Dans cet exemple, c'est «[I». Qu'est-ce que c'est ...? Si vous pensez que oui, relisez l'explication. La chaîne avant @, qui est le résultat de getClass (). GetName (). Alors, quel genre de spécifications avez-vous?

Il est difficile d'expliquer ou de comprendre le type de retour Class de getClass () en détail, donc pour le moment, j'aimerais que vous le reconnaissiez comme "un objet qui représente une instance de quelle classe".

Class#getName

Renvoie le nom de l'entité (classe, interface, classe de tableau, type primitif ou void) représentée par cet objet Class sous forme de chaîne. Si cet objet de classe représente un type de référence de type non-tableau, comme spécifié dans la spécification du langage Java (tm), le nom binaire de la classe est renvoyé.

Si cet objet de classe représente un type primitif ou void, le nom renvoyé est une chaîne équivalente au mot clé du langage Java correspondant au type primitif ou void.

Lorsque cet objet de classe représente une classe d'un tableau, la forme interne du nom se compose d'un ou plusieurs [caractères, le nom du type d'élément, qui représente la profondeur d'imbrication du tableau. Le codage du nom du type d'élément est le suivant:

Codage du type d'élément type booléen Z byte B char C classe ou interface Lclassname; double D float F int I long J short S Le nom de classe du nom de classe ou du nom d'interface est spécifié par le nom binaire de la classe comme dans l'exemple ci-dessus.

Exemple

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"

En termes simples, il s'agit d'une chaîne qui représente le type de l'instance. Veuillez faire attention au cas d'arrangement. Le format est tel que «[» est aligné sur le nombre de dimensions du tableau, suivi du nom de la classe (L est inséré s'il ne s'agit pas d'une primitive). Dans le dernier cas de l'exemple, puisque le tableau est à 7 dimensions, 7 [ sont alignés, suivis de I indiquant qu'il s'agit d'un tableau int. En d'autres termes, «[I» exprimait que cet objet est un tableau int unidimensionnel.

Comme mentionné ci-dessus, la première sortie apparemment incompréhensible a été produite conformément aux spécifications. Ne supposez pas que c'est un bogue simplement parce que c'est une chaîne sans signification, mais examinons correctement le comportement d'origine. Au fait, si vous voulez afficher correctement le contenu du tableau, passez-le à Arrays.toString () (Arrays.deepToString () pour un tableau multidimensionnel) pour en faire une chaîne, ou le sortir en utilisant une boucle.

Recommended Posts

L'histoire de toString () commençant par le passage d'un tableau à System.out.println
Comment demander en passant un tableau à une requête avec le client HTTP de Ruby
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
[Swift5] Comment obtenir un tableau et un ensemble de différences entre les tableaux
Une histoire sur la connexion à un serveur CentOS 8 avec un ancien Ansible
Comparer les éléments d'un tableau (Java)
Convertir un tableau de chaînes en nombres
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
L'histoire de l'introduction de la communication Ajax à Ruby
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
L'histoire du réglage de l'application Android avec libGDX
L'histoire de l'ajout du dernier Node.js à DockerFile
[Swift] Comment obtenir le nombre d'éléments dans un tableau (super basique)
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
Comparaison de vitesse lorsque le côté valeur de Hash veut tout récupérer avec un tableau
Convertit le tableau d'erreurs.full_messages en caractères et sortie
Tester le contenu d'un fichier Excel avec JUnit
L'histoire de la création d'un proxy inverse avec ProxyServlet
L'histoire d'une exception d'état illégale dans Jetty.
Manipulez les pixels pour créer une image d'un ensemble de Mandelbrot
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
Une histoire remplie des bases de Spring Boot (résolu)
Comment récupérer la valeur de hachage dans un tableau dans Ruby
Initialisation avec une chaîne vide vers une instance de type Java String
Comment ajouter des éléments sans spécifier la longueur du tableau
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
Assurez-vous de comparer le résultat Java compareTo avec 0
[Apache Tomcat] L'histoire de l'utilisation d'Apache OpenWebBeans pour activer CDI
[Java] Comment rechercher des valeurs dans un tableau (ou une liste) avec la méthode contains
Une histoire sur la lutte contre les erreurs Ubuntu 0x80370114 et 0x80000000 pour activer Docker Desktop avec WSL2 dans Windows10 Home
L'histoire du refactoring avec un assistant personnel pour la première fois dans une application Rails
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Convertir un tableau de chaînes en une liste d'entiers en Java
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
Comment obtenir la longueur d'un fichier audio avec Java
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
L'histoire de l'introduction de Gradle en tant que modernisation d'un système existant qui ne gérait pas de packages
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
[Édition Java] Histoire de la sérialisation
Histoire du passage de Java Gold SE8
L'histoire de @ViewScoped dévore la mémoire
L'histoire que je voulais développer Zip
Comment décorer CSS sur les boutons radio de rails6 form_with (helper)
[Swift] Résumé de la suppression des éléments d'un tableau (mémo personnel)
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
L'histoire du passage d'Amazon RDS pour MySQL à Amazon Aurora Serverless
Comment accéder directement à Socket avec la fonction TCP de Spring Integration