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

110

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

Comment s'appelle ce type d'encodage?

Landon Kuhn
la source

Réponses:

211

[Ljava.lang.Object;est le nom de Object[].class, le java.lang.Classreprésentant la classe du tableau de Object.

Le schéma de dénomination 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 spécifié par la spécification du langage Java ( §13.1 ).

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

Si cet objet de classe représente une classe de tableaux, la forme interne du nom se compose du nom du type d'élément précédé d'un ou plusieurs '['caractères représentant la profondeur de l'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 toString()méthode sur les tableaux retourne Stringdans ce format est que les tableaux ne contiennent pas @Overridela méthode héritée de Object, qui est spécifiée comme suit:

La toStringméthode de la classeObject renvoie une chaîne composée du nom de la classe dont l'objet est une instance, du caractère at-sign `` @ '' et de la représentation hexadécimale non signée du code de hachage de l'objet. En d'autres termes, cette méthode renvoie une chaîne égale à la valeur de:

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

Remarque : vous ne pouvez pas compter sur letoString()d'un objet arbitraire pour suivre la spécification ci-dessus, car ils peuvent (et le font généralement)@Overridepour renvoyer autre chose. La manière la plus fiable d'inspecter le type d'un objet arbitraire est de l'invoquergetClass()(unefinalméthode héritée deObject) puis de réfléchir sur l'Classobjetretourné. Dans l'idéal, cependant, l'API aurait dû être conçue de telle sorte que la réflexion ne soit pas nécessaire (voir Effective Java 2nd Edition, Item 53: Préférer les interfaces à la réflexion ).


Sur un plus "utile" toStringpour les tableaux

java.util.Arraysfournit des toStringsurcharges pour les tableaux primitifs et Object[]. deepToStringVous pouvez également utiliser des 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.equalset Arrays.deepEqualsqui effectuent une comparaison d'égalité de tableau par leurs éléments, parmi de nombreuses autres méthodes utilitaires liées aux tableaux.

Questions connexes

lubrifiants polygènes
la source