Cos'è [Ljava.lang.Object ;?

1. Panoramica

In questo tutorial, impareremo cosa significa [Ljava.lang.Object e come accedere ai valori corretti dell'oggetto.

2. Java Object Class

In Java, se vogliamo stampare un valore direttamente da un oggetto, la prima cosa che potremmo provare è chiamare il suo metodo toString :

Object[] arrayOfObjects = { "John", 2, true }; assertTrue(arrayOfObjects.toString().startsWith("[Ljava.lang.Object;"));

Se eseguiamo il test, avrà esito positivo, ma di solito non è un risultato molto utile.

Quello che vogliamo fare è stampare i valori all'interno dell'array. Invece, abbiamo [Ljava.lang.Object. Il nome della classe, come implementato in Object.class :

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

Quando otteniamo il nome della classe direttamente dall'oggetto, stiamo ottenendo i nomi interni dalla JVM con i loro tipi, ecco perché abbiamo caratteri extra come [ e L , che rappresentano rispettivamente i tipi Array e ClassName.

3. Stampa di valori significativi

Per poter stampare correttamente il risultato, possiamo usare alcune classi dal pacchetto java.util .

3.1. Array

Ad esempio, possiamo utilizzare due dei metodi nella classe Arrays per gestire la conversione.

Con gli array unidimensionali, possiamo usare il metodo toString :

Object[] arrayOfObjects = { "John", 2, true }; assertEquals(Arrays.toString(arrayOfObjects), "[John, 2, true]");

Per array più profondi, abbiamo il metodo deepToString :

Object[] innerArray = { "We", "Are", "Inside" }; Object[] arrayOfObjects = { "John", 2, innerArray }; assertEquals(Arrays.deepToString(arrayOfObjects), "[John, 2, [We, Are, Inside]]");

3.2. Streaming

Una delle nuove funzionalità significative in JDK 8 è l'introduzione dei flussi Java , che contiene classi per l'elaborazione di sequenze di elementi:

Object[] arrayOfObjects = { "John", 2, true }; List listOfString = Stream.of(arrayOfObjects) .map(Object::toString) .collect(Collectors.toList()); assertEquals(listOfString.toString(), "[John, 2, true]");

Innanzitutto, abbiamo creato uno stream utilizzando il metodo helper di. Abbiamo convertito tutti gli oggetti all'interno dell'array in una stringa utilizzando map, quindi l'abbiamo inserito in un elenco utilizzando collect per stampare i valori.

4. Conclusione

In questo tutorial, abbiamo visto come possiamo stampare informazioni significative da un array ed evitare il valore predefinito [Ljava.lang.Object ;.

Possiamo sempre trovare il codice sorgente di questo articolo su GitHub.