web-dev-qa-db-fra.com

Qu'est-ce que c'est: [Ljava.lang.Object ;?

Je l’obtiens lorsque j’appelle toString sur un objet que j’ai reçu d’un appel de fonction. Je sais que le type de l'objet est codé dans cette chaîne, mais je ne sais pas comment le lire.

Comment appelle-t-on ce type de codage?

100
Landon Kuhn

[Ljava.lang.Object; Est le nom de Object[].class, Le Java.lang.Class représentant la classe du tableau de Object.

Le schéma de nommage est documenté dans Class.getName() :

Si cet objet de classe représente un type de référence qui n'est pas un type de tableau, le nom binaire de la classe est renvoyé, comme indiqué par Java Spécification du langage ( §13.1 ).

Si cet objet de classe représente un type primitif ou void, le nom renvoyé est le mot-clé Java) correspondant au type primitif ou void.

Si cet objet de classe représente une classe de tableaux, la forme interne du nom est constituée du nom du type d'élément précédé d'un ou plusieurs caractères '[' Représentant la profondeur d'imbrication du tableau. Le codage des noms de type d'élément est le suivant:

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

Le vôtre est le dernier sur cette liste. Voici quelques exemples:

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

La raison pour laquelle la méthode toString() sur les tableaux renvoie String dans ce format est due au fait que les tableaux ne @Override Ne sont pas hérités de la méthode héritée de Object, spécifiée par suit:

La méthode toString de la classe Object renvoie une chaîne constituée du nom de la classe dont l'objet est une instance, le caractère de signe "@", et la représentation hexadécimale non signée du code de hachage de l'objet. En d'autres termes, cette méthode retourne une chaîne égale à la valeur de:

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

Remarque: vous ne pouvez pas compter sur la toString() d'un objet quelconque pour suivre ce qui précède spécification, puisqu’ils peuvent (et le font généralement) @Override le renvoyer. Le moyen le plus fiable d’inspecter le type d’un objet arbitraire est d’appeler getClass() (méthode final héritée de Object) et then reflétant sur l'objet Class renvoyé. Idéalement, cependant, l’API aurait dû être conçue de sorte que la réflexion ne soit pas nécessaire (voir Effective Java 2e édition, élément 53: Préférez les interfaces à la réflexion) .


Sur un plus "utile" toString pour les tableaux

Java.util.Arrays fournit toString surcharges pour les tableaux primitifs et Object[]. Vous pouvez également utiliser deepToString pour les tableaux imbriqués.

Voici quelques exemples:

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

Il existe également Arrays.equals Et Arrays.deepEquals Qui effectuent une comparaison d'égalité de matrice par leurs éléments, parmi de nombreuses autres méthodes utilitaires liées à la matrice.

Questions connexes

199
polygenelubricants