Articolo originale: Java Array Methods – How to Print an Array in Java

Un array è una struttura di dati usata per immagazzinare dati dello stesso tipo. Gli array immagazzinano i propri elementi in posizioni di memoria contigue.

In Java, gli array sono oggetti. Tutti i metodi della classe object possono essere chiamati su un array. Possiamo immagazzinare un numero fisso di elementi in un array.

Dichiariamo un semplice array di tipo primitivo:

int[] intArray = {2,5,46,12,34};

Adesso proviamo a stamparlo usando il metodo System.out.println():

System.out.println(intArray);
// output: [I@74a14482

Perché Java non ha stampato il nostro array? Che cosa sta succedendo dietro le quinte?

Il metodo System.out.println() converte l'oggetto che abbiamo passato in una stringa chiamando String.valueOf(). Se diamo un'occhiata all'implementazione del metodo String.valueOf() vedremo questo:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Se l'oggetto passato è null ci restituisce null, altrimenti chiama il metodo obj.toString() . Alla fine, System.out.println() chiama toString() per stampare l'output.

Se la classe di quell'oggetto non sovrascrive l'implementazione di Object.toString(), chiamerà il metodo Object.toString().

Object.toString() restituisce getClass().getName()+‘@’+Integer.toHexString(hashCode()) . In parole povere, restituisce: "nome della classe @ codice hash dell'oggetto".

Nel nostro precedente output [I@74a14482 , [ esprime che si tratta di un array, e I sta per int (il tipo dell'array). 74a14482 è la rappresentazione esadecimale senza segno del codice hash dell'array.

Ogni volta che creiamo le nostre classi personalizzate, è buona prassi sovrascrivere il metodo Object.toString().

Non possiamo stampare gli array in Java usando il banale metodo System.out.println(). Invece, questi sono i modi in cui possiamo stampare un array:

  1. Loop: loop for e loop for-each
  2. Il metodo Arrays.toString()
  3. Il metodo Arrays.deepToString()
  4. Il metodo Arrays.asList()
  5. L'interfaccia Java Iterator
  6. Java Stream API

Vediamoli uno ad uno.

1. Loop: loop for e loop for-each

Ecco un esempio di un loop for:

int[] intArray = {2,5,46,12,34};

for(int i=0; i<intArray.length; i++){
    System.out.print(intArray[i]);
    // output: 25461234
}

Tutte le classi wrapper sovrascrivono Object.toString() e restituiscono una rappresentazione del loro valore in formato di stringa.

Ed ecco un loop for-each:

int[] intArray = {2,5,46,12,34};

for(int i: intArray){
    System.out.print(i);
    // output: 25461234
}

2. Il metodo Arrays.toString()

Arrays.toString() è un metodo statico della classe array che appartiene al package java.util. Restituisce una rappresentazione dei contenuti dell'array specificato in formato di stringa. Possiamo stampare array unidimensionali usando questo metodo.

Gli elementi dell'array sono convertiti in stringhe usando il metodo String.valueOf(), in questo modo:

int[] intArray = {2,5,46,12,34};
System.out.println(Arrays.toString(intArray));
// output: [2, 5, 46, 12, 34]

Per un array di riferimenti, dobbiamo assicurarci che la classe del tipo di riferimento sovrascriva il metodo Object.toString().

Per esempio:

public class Test {
    public static void main(String[] args) {
        Studente[] studenti = {new Studente("John"), new Studente("Doe")};
        
        System.out.println(Arrays.toString(studenti));
        // output: [Studente{nome='John'}, Studente{nome='Doe'}]
    }
}

class Studente {
    private String nome;

    public Student(String nome){
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return "Studente{" + "nome='" + nome + '\'' + '}';
    }
}

Questo metodo non è appropriato per array multidimensionali. Converte gli array multidimensionali in stringhe usando Object.toString() che descrive i loro id al posto dei loro contenuti.

Per esempio:

// creo un array multidimensionale
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.toString(multiDimensionalArr));
// output: [[I@74a14482, [I@1540e19d]

Con l'aiuto di Arrays.deepToString(), possiamo stampare array multidimensionali.

3. Il metodo Arrays.deepToString()

Arrays.deepToString() restituisce una rappresentazione dei "contenuti profondi" dell'array specificato in formato di stringa.

Se l'elemento è un array di tipo primitivo, viene convertito in una stringa chiamando il sovraccarico appropriato di Arrays.toString() .

Ecco un esempio di un array multidimensionale di tipo primitivo:

// creo un array multidimensionale
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.deepToString(multiDimensionalArr));
// output: [[2, 3], [5, 9]]

Se l'elemento è un array di riferimenti, viene convertito in una stringa chiamando ricorsivamente Arrays.deepToString().

Insegnante[][] insegnanti = 
{{ new Insegnante("John"), new Insegnante("David") }, {new Insegnante("Mary")} };

System.out.println(Arrays.deepToString(insegnanti));
// output: 
[[Insegnante{nome='John'}, Insegnante{nome='David'}],[Insegnante{nome='Mary'}]]

Dobbiamo sovrascrivere Object.toString() nella nostra classe Insegnante.

Se ti incuriosisce il modo in cui viene eseguita la ricorsione, ecco il codice sorgente del metodo Arrays.deepToString().

NOTA: anche gli array unidimensionali di riferimenti possono essere stampati usando questo metodo. Per esempio:

Integer[] oneDimensionalArr = {1,4,7};

System.out.println(Arrays.deepToString(oneDimensionalArr));
// output: [1, 4, 7]

4. Il metodo Arrays.asList()

Questo metodo restituisce una lista di dimensioni fisse costruita sull'array specificato.

Integer[] intArray = {2,5,46,12,34};

System.out.println(Arrays.asList(intArray));
// output: [2, 5, 46, 12, 34]

Abbiamo cambiato il tipo da int a Integer, perché List è un insieme che contiene una lista di oggetti. Quando convertiamo un array in una lista dovrebbe essere un array di riferimenti.

Java chiama Arrays.asList(intArray).toString() . Questa tecnica usa internamente il metodo toString() del tipo degli elementi all'interno della lista.

Un altro esempio con la nostra classe personalizzata Insegnante:

Insegnante[] insegnante = { new Insegnante("John"), new Insegnante("Mary") };

System.out.println(Arrays.asList(insegnante));
// output: [Insegnante{nome='John'}, Insegnante{nome='Mary'}]

NOTA: non possiamo stampare array multidimensionali usando questo metodo. Per esempio:

Insegnante[][] insegnanti = 
{{ new Insegnante("John"), new Insegnante("David") }, { new Insegnante("Mary") }};
        
System.out.println(Arrays.asList(insegnanti));

// output: [[Lcom.thano.article.printarray.Insegnante;@1540e19d, [Lcom.thano.article.printarray.Insegnante;@677327b6]

5. L'interfaccia Java Iterator

In modo simile a un loop for-each, possiamo usare l'interfaccia Iterator per iterare attraverso gli elementi dell'array e stamparli.

L'oggetto Iterator può essere creato chiamando il metodo iterator() su una Collection. Quell'oggetto verrà usato per iterare attraverso gli elementi della Collection.

Ecco un esempio di come possiamo stampare un array usando l'interfaccia Iterator:

Integer[] intArray = {2,5,46,12,34};

// creo una List di Integer
List<Integer> list = Arrays.asList(intArray);

// creo un iteratore della Integer List
Iterator<Integer> it = list.iterator();

// se la List ha elementi da iterare
while(it.hasNext()) {
    System.out.print(it.next());
    // output: 25461234
}

6. Java Stream API

La Stream API è usata per lavorare con insiemi di oggetti. Uno stream è una sequenza di oggetti. Gli stream non cambiano la struttura dei dati originaria, forniscono soltanto il risultato delle operazioni richieste.

Con l'aiuto dell'operazione terminale forEach() possiamo iterare attraverso ogni elemento dello stream.

Per esempio:

Integer[] intArray = {2,5,46,12,34};

Arrays.stream(intArray).forEach(System.out::print);
// output: 25461234

Adesso sappiamo come stampare un array in Java.

Grazie per aver letto.

Immagine di copertina di Aziz Acharki su Unsplash.

Puoi leggere gli altri miei articoli su Medium.

Buona Programmazione!