J'obtiens cela lorsque j'appelle toString
un 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?
[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 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 ouvoid
.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 String
dans ce format est que les tableaux ne contiennent pas @Override
la méthode héritée de Object
, qui est spécifiée comme suit:
La
toString
mé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)@Override
pour renvoyer autre chose. La manière la plus fiable d'inspecter le type d'un objet arbitraire est de l'invoquergetClass()
(unefinal
méthode héritée deObject
) puis de réfléchir sur l'Class
objetretourné. 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 ).
toString
pour les tableauxjava.util.Arrays
fournit des toString
surcharges pour les tableaux primitifs et Object[]
. deepToString
Vous 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.equals
et Arrays.deepEquals
qui effectuent une comparaison d'égalité de tableau par leurs éléments, parmi de nombreuses autres méthodes utilitaires liées aux tableaux.