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 stringIl [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.
| Approccio | Ideale per | Stile di output |
|---|---|---|
Arrays.toString | Array primitivi o di oggetti 1D | [a, b, c] |
Arrays.deepToString | Array annidati / multidimensionali | [[a, b], [c, d]] |
String.join | String[] con un delimitatore personalizzato | a, b, c (senza parentesi) |
ciclo manuale / StringBuilder | controllo totale sul formato | qualsiasi 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 | gammaPer 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.
Cosa ricavare dall'esecuzione:
toString: [3, 1, 4, 1, 5]mostra comeArrays.toStringtrasformi unint[]piatto in testo leggibile e tra parentesi quadre.words: [alpha, beta, gamma]conferma che lo stesso metodo funziona sugli array di oggetti richiamando iltoString()di ogni elemento.shallow: truedimostra cheArrays.toStringsu un array 2D lascia gli array interni come riferimenti[[I@..., motivo per cui il risultato inizia con[[I@.deep: [[1, 2], [3, 4]]mostra comeArrays.deepToStringricorra negli array annidati per stampare ogni elemento.joined: alpha | beta | gammaemanual: {3; 1; 4; 1; 5}mostrano comeString.joine un ciclo conStringBuilderproducano output senza parentesi con delimitatori personalizzati.