Ottengo questo quando chiamo toString
un oggetto ricevuto da una chiamata di funzione. So che il tipo di oggetto è codificato in questa stringa, ma non so come leggerlo.
Come si chiama questo tipo di codifica?
Ottengo questo quando chiamo toString
un oggetto ricevuto da una chiamata di funzione. So che il tipo di oggetto è codificato in questa stringa, ma non so come leggerlo.
Come si chiama questo tipo di codifica?
Risposte:
[Ljava.lang.Object;
è il nome di Object[].class
, che java.lang.Class
rappresenta la classe dell'array di Object
.
Lo schema di denominazione è documentato in Class.getName()
:
Se questo oggetto classe rappresenta un tipo di riferimento che non è un tipo di matrice, viene restituito il nome binario della classe, come specificato dalla specifica del linguaggio Java ( §13.1 ).
Se questo oggetto classe rappresenta un tipo primitivo o
void
, il nome restituito è la parola chiave del linguaggio Java corrispondente al tipo primitivo ovoid
.Se questo oggetto classe rappresenta una classe di array, la forma interna del nome è costituita dal nome del tipo di elemento preceduto da uno o più
'['
caratteri che rappresentano la profondità della nidificazione dell'array. La codifica dei nomi dei tipi di elemento è la seguente:Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
Il tuo è l'ultimo di quella lista. Ecco alcuni esempi:
// 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
Il motivo per cui il toString()
metodo sugli array restituisce String
in questo formato è perché gli array non hanno @Override
il metodo ereditato da Object
, che è specificato come segue:
Il
toString
metodo per classObject
restituisce una stringa composta dal nome della classe di cui l'oggetto è un'istanza, il carattere del segno "@" e la rappresentazione esadecimale senza segno del codice hash dell'oggetto. In altre parole, questo metodo restituisce una stringa uguale al valore di:getClass().getName() + '@' + Integer.toHexString(hashCode())
Nota : non puoi fare affidamento sullatoString()
di qualsiasi oggetto arbitrario per seguire la specifica di cui sopra, poiché possono (e di solito lo fanno)@Override
restituire qualcos'altro. Il modo più affidabile per ispezionare il tipo di un oggetto arbitrario è invocarlogetClass()
(unfinal
metodo ereditato daObject
) e quindi riflettereClass
sull'oggettorestituito. Idealmente, tuttavia, l'API dovrebbe essere stata progettata in modo tale che la riflessione non sia necessaria (vedere Effective Java 2nd Edition, Item 53: Prefer interfaces to reflection ).
toString
per gli arrayjava.util.Arrays
fornisce toString
overload per array primitivi e Object[]
. C'è anche deepToString
quello che potresti voler usare per gli array annidati.
Ecco alcuni esempi:
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]]
Ci sono anche Arrays.equals
e Arrays.deepEquals
che eseguono il confronto dell'uguaglianza degli array in base ai loro elementi, tra molti altri metodi di utilità relativi agli array.