W3docs

Comment afficher un tableau en Java

Affichez des tableaux Java lisiblement avec Arrays.toString, Arrays.deepToString et le formatage par flux.

Passer un tableau directement à System.out.println n'affiche presque jamais ce que vous attendez — vous obtenez quelque chose comme [I@1b6d3586 au lieu des éléments. Les tableaux ne redéfinissent pas toString(), donc la version par défaut d'Object affiche le type et un hash d'identité. Ce chapitre présente les solutions idiomatiques : Arrays.toString pour les tableaux plats, Arrays.deepToString pour les tableaux imbriqués, String.join pour les délimiteurs personnalisés, et une boucle manuelle quand vous avez besoin d'un contrôle total.

Pourquoi un affichage simple échoue

Le toString() par défaut qu'un tableau hérite d'Object renvoie une signature de classe suivie d'un code de hachage — pas le contenu :

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

[I signifie « tableau d'int » ; l'hexadécimal après @ est le hash d'identité, qui change entre les exécutions. Concaténer le tableau dans une chaîne n'aide pas, car la concaténation appelle également toString(). La solution consiste à demander à un utilitaire de formater les éléments à votre place.

Arrays.toString pour une dimension

java.util.Arrays.toString parcourt un tableau à une seule dimension et renvoie une chaîne lisible, séparée par des virgules, entre crochets :

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]

Elle est surchargée pour chaque type de tableau primitif (int[], double[], boolean[], …) et pour Object[], donc elle fonctionne sur n'importe quel tableau plat que vous lui passez. Pour les tableaux d'objets, elle appelle le propre toString() de chaque élément.

Arrays.deepToString pour les tableaux imbriqués

Arrays.toString ne descend qu'à un seul niveau. Sur un tableau 2D, elle formate le tableau externe mais affiche chaque tableau interne comme une référence. Utilisez Arrays.deepToString pour récurser à travers tous les niveaux :

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

Utilisez deepToString dès que le tableau contient d'autres tableaux — matrices, tableaux irréguliers, tableaux de tableaux d'objets.

ApprocheIdéale pourStyle de sortie
Arrays.toStringTableaux primitifs ou d'objets 1D[a, b, c]
Arrays.deepToStringTableaux imbriqués / multidimensionnels[[a, b], [c, d]]
String.joinString[] avec un délimiteur personnaliséa, b, c (sans crochets)
boucle manuelle / StringBuilderContrôle total du formattout ce que vous construisez

Formatage personnalisé

Quand le format entre crochets par défaut ne convient pas, String.join joint un String[] (ou tout itérable CharSequence) avec le délimiteur de votre choix et sans crochets :

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

Pour les tableaux non-string ou une sortie entièrement personnalisée, une boucle avec un StringBuilder vous donne un contrôle total sur les séparateurs, les préfixes et le formatage par élément. Les flux sont une autre option : Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(", ")).

Un exemple exécutable

Le programme ci-dessous compare les approches : Arrays.toString sur un int[] et un String[] plats, la différence superficiel-vs-profond sur un tableau 2D, String.join pour un délimiteur personnalisé, et un StringBuilder construit à la main. La ligne shallow vérifie si le toString superficiel du tableau 2D contient encore des références internes, elle affiche donc un true stable plutôt qu'un hash variable d'une exécution à l'autre.

java— editable, runs on the server

Ce que l'exécution nous apprend :

  • toString: [3, 1, 4, 1, 5] montre Arrays.toString transformant un int[] plat en texte lisible entre crochets.
  • words: [alpha, beta, gamma] confirme que la même méthode fonctionne sur les tableaux d'objets en appelant le toString() de chaque élément.
  • shallow: true prouve que Arrays.toString appliqué à un tableau 2D laisse les tableaux internes comme des références [[I@..., c'est pourquoi le résultat commence par [[I@.
  • deep: [[1, 2], [3, 4]] montre Arrays.deepToString récursant dans les tableaux imbriqués pour afficher chaque élément.
  • joined: alpha | beta | gamma et manual: {3; 1; 4; 1; 5} montrent String.join et une boucle StringBuilder produisant une sortie sans crochets avec des délimiteurs personnalisés.

Pratique

Pratique
Que affiche Arrays.toString(grid) quand grid est un tableau int bidimensionnel comme {{1, 2}, {3, 4}}?
Que affiche Arrays.toString(grid) quand grid est un tableau int bidimensionnel comme {{1, 2}, {3, 4}}?
Was this page helpful?