Cos'è questo: [Ljava.lang.Object ;?


110

Ottengo questo quando chiamo toStringun 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:


211

[Ljava.lang.Object;è il nome di Object[].class, che java.lang.Classrappresenta 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 o void.

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 Stringin questo formato è perché gli array non hanno @Overrideil metodo ereditato da Object, che è specificato come segue:

Il toStringmetodo 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)@Overriderestituire qualcos'altro. Il modo più affidabile per ispezionare il tipo di un oggetto arbitrario è invocarlogetClass()(unfinalmetodo 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 ).


Su un più "utile" toStringper gli array

java.util.Arraysfornisce toStringoverload per array primitivi e Object[]. C'è anche deepToStringquello 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.equalse Arrays.deepEqualsche eseguono il confronto dell'uguaglianza degli array in base ai loro elementi, tra molti altri metodi di utilità relativi agli array.

Domande correlate

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.