W3docs

Come stampare un array in Java

Stampa array Java in modo leggibile con Arrays.toString, Arrays.deepToString e la formattazione basata su stream.

Passare un array direttamente a System.out.println quasi mai stampa quello che si desidera — si ottiene qualcosa come [I@1b6d3586 invece degli elementi. Gli array non sovrascrivono toString(), quindi la versione predefinita di Object stampa il tipo e un hash di identità. Questo capitolo mostra le soluzioni idiomatiche: Arrays.toString per gli array piatti, Arrays.deepToString per quelli annidati, String.join per i delimitatori personalizzati, e un ciclo manuale quando si ha bisogno di controllo totale.

Perché una stampa diretta fallisce

Il toString() predefinito che un array eredita da Object restituisce la firma della classe più un codice hash — non il contenuto:

int[] numbers = {3, 1, 4};
System.out.println(numbers);       // [I@1b6d3586
System.out.println("" + numbers);  // same reference string

Il [I significa "array di int"; il valore esadecimale dopo @ è l'hash di identità, che cambia tra un'esecuzione e l'altra. Concatenare l'array in una stringa non aiuta, perché la concatenazione richiama anch'essa toString(). La soluzione è affidarsi a un helper che formatti gli elementi al posto tuo.

Arrays.toString per una dimensione

java.util.Arrays.toString percorre un array monodimensionale e restituisce una stringa leggibile separata da virgole tra parentesi quadre:

int[] numbers = {3, 1, 4, 1, 5};
System.out.println(Arrays.toString(numbers)); // [3, 1, 4, 1, 5]

String[] words = {"alpha", "beta"};
System.out.println(Arrays.toString(words));   // [alpha, beta]

È sovraccaricato per ogni tipo di array primitivo (int[], double[], boolean[], …) e per Object[], quindi funziona con qualsiasi array piatto che gli si passa. Per gli array di oggetti richiama il toString() di ogni elemento.

Arrays.deepToString per gli array annidati

Arrays.toString scende solo di un livello. Su un array 2D formatta l'array esterno ma stampa ogni array interno come riferimento. Usa Arrays.deepToString per ricorrere attraverso ogni livello:

int[][] grid = {{1, 2}, {3, 4}};
System.out.println(Arrays.toString(grid));     // [[I@..., [I@...]
System.out.println(Arrays.deepToString(grid)); // [[1, 2], [3, 4]]

Usa deepToString ogni volta che l'array contiene altri array — matrici, array irregolari, array di array di oggetti.

ApproccioIdeale perStile di output
Arrays.toStringArray primitivi o di oggetti 1D[a, b, c]
Arrays.deepToStringArray annidati / multidimensionali[[a, b], [c, d]]
String.joinString[] con un delimitatore personalizzatoa, b, c (senza parentesi)
ciclo manuale / StringBuildercontrollo totale sul formatoqualsiasi formato tu costruisca

Formattazione personalizzata

Quando il formato predefinito con parentesi non è quello desiderato, String.join unisce un String[] (o qualsiasi iterabile CharSequence) con un delimitatore a scelta e senza parentesi:

String[] words = {"alpha", "beta", "gamma"};
System.out.println(String.join(" | ", words)); // alpha | beta | gamma

Per array non di stringhe o output completamente personalizzato, un ciclo con un StringBuilder ti offre controllo totale su separatori, prefissi e formattazione per elemento. Gli stream sono un'altra opzione: Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(", ")).

Un esempio eseguibile

Il programma seguente mette a confronto i vari approcci: Arrays.toString su int[] e String[] piatti, la differenza tra superficiale e profondo su un array 2D, String.join per un delimitatore personalizzato, e un StringBuilder costruito a mano. La riga shallow verifica se il toString superficiale dell'array 2D contiene ancora riferimenti interni, quindi stampa un true stabile invece di un hash che varia tra esecuzioni.

java— editable, runs on the server

Cosa ricavare dall'esecuzione:

  • toString: [3, 1, 4, 1, 5] mostra come Arrays.toString trasformi un int[] piatto in testo leggibile e tra parentesi quadre.
  • words: [alpha, beta, gamma] conferma che lo stesso metodo funziona sugli array di oggetti richiamando il toString() di ogni elemento.
  • shallow: true dimostra che Arrays.toString su un array 2D lascia gli array interni come riferimenti [[I@..., motivo per cui il risultato inizia con [[I@.
  • deep: [[1, 2], [3, 4]] mostra come Arrays.deepToString ricorra negli array annidati per stampare ogni elemento.
  • joined: alpha | beta | gamma e manual: {3; 1; 4; 1; 5} mostrano come String.join e un ciclo con StringBuilder producano output senza parentesi con delimitatori personalizzati.

Esercizio

Pratica
Cosa stampa Arrays.toString(grid) quando grid è un array int bidimensionale come {{1, 2}, {3, 4}}?
Cosa stampa Arrays.toString(grid) quando grid è un array int bidimensionale come {{1, 2}, {3, 4}}?
Was this page helpful?