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?
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é.
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 ()
?
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 **.
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".
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