Essayer de coder ← Retour aux sujets

Tableaux à une dimension

type[]

Un tableau Java est un objet de taille fixe, dont les cases démarrent à 0, false ou null. Les indices vont de 0 à length - 1 et Java vérifie chaque accès.

int[] t = new int[5];
5 entiers, tous égaux à 0
int[] t = {10, 20, 30};
Valeurs de départ ; taille 3
t.length
Nombre de cases (un attribut : pas de parenthèses)
t[0] = 42;
Écrire dans la case d'indice 0
t[t.length]
Hors limites : ArrayIndexOutOfBoundsException
Arrays.toString(t)
Texte lisible : [10, 20, 30]
Moyenne.java
public class Moyenne {
    public static void main(String[] args) {
        int[] notes = {12, 15, 9, 18};
        int somme = 0;

        for (int i = 0; i < notes.length; i++) {
            somme += notes[i];
        }
        System.out.println("moyenne = " + (double) somme / notes.length);
    }
}
Affichage
moyenne = 13.5

La classe Arrays

java.util.Arrays

Arrays offre les opérations courantes sur un tableau : afficher, trier, remplir, copier, comparer.

Arrays.toString(t)
Afficher un tableau
Arrays.sort(t)
Trier en place, par ordre croissant
Arrays.fill(t, 0)
Remplir toutes les cases
Arrays.copyOf(t, n)
Copie de taille n
Arrays.equals(a, b)
Compare le contenu de deux tableaux
int[][] g = new int[3][4];
Tableau 2D : 3 lignes, 4 colonnes
Outils.java
import java.util.Arrays;

public class Outils {
    public static void main(String[] args) {
        int[] t = {5, 2, 9, 1};

        Arrays.sort(t);
        System.out.println(Arrays.toString(t));

        int[] copie = Arrays.copyOf(t, t.length);
        copie[0] = 100;
        System.out.println(Arrays.toString(t));
        System.out.println(Arrays.equals(t, copie));
    }
}
Affichage
[1, 2, 5, 9]
[1, 2, 5, 9]
false

📊 Le cours : ranger plusieurs valeurs

Un tableau range plusieurs valeurs du même type sous un seul nom. Sa taille est fixée à la création. Les notions générales (indices, parcours, copies) sont celles du chapitre Tableaux 1D ; ici, c'est leur version Java.

Déclarer, créer, initialiser

int[] t déclare une variable qui pourra désigner un tableau d'entiers ; new int[5] crée le tableau. Les cases reçoivent une valeur par défaut : 0 pour les nombres, false pour les booléens, null pour les objets (dont les String).

Declaration.java
public class Declaration {
    public static void main(String[] args) {
        int[] a = new int[3];             // 0 0 0
        double[] b = {1.5, 2.5};
        boolean[] c = new boolean[2];     // false false
        String[] d = new String[2];       // null null

        System.out.println(a[1] + " " + b.length + " " + c[0] + " " + d[1]);
    }
}
Affichage
0 2 false null

Parcourir un tableau

Avec un for classique quand on a besoin de l'indice, avec un for-each sinon. Voici la recherche de l'indice du maximum.

Maximum.java
public class Maximum {
    public static void main(String[] args) {
        int[] t = {3, 9, 2, 7};
        int imax = 0;

        for (int i = 1; i < t.length; i++) {
            if (t[i] > t[imax]) {
                imax = i;
            }
        }
        System.out.println("max = " + t[imax] + " a l'indice " + imax);
    }
}
Affichage
max = 9 a l'indice 1

Un tableau est un objet : attention aux alias

La variable b d'un int[] b = a; ne contient pas une copie du tableau, mais la même référence : les deux noms désignent le même tableau. Pour une vraie copie, utilise clone() ou Arrays.copyOf. (C'est le phénomène d'*aliasing* de Aliasing et copies.)

Alias.java
public class Alias {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        int[] b = a;              // même tableau, pas une copie
        b[0] = 99;
        System.out.println(a[0]);

        int[] c = a.clone();      // vraie copie
        c[1] = 77;
        System.out.println(a[1]);
    }
}
Affichage
99
2

Passer un tableau à une méthode

La méthode reçoit la copie de la référence : elle peut modifier le contenu du tableau de l'appelant. Contrairement au C, elle connaît sa taille grâce à t.length.

Methodes.java
public class Methodes {
    static int somme(int[] t) {
        int s = 0;
        for (int x : t) {
            s += x;
        }
        return s;
    }

    static void doubler(int[] t) {
        for (int i = 0; i < t.length; i++) {
            t[i] *= 2;
        }
    }

    public static void main(String[] args) {
        int[] t = {1, 2, 3, 4};
        doubler(t);
        System.out.println(somme(t));
    }
}
Affichage
20

Tableaux à deux dimensions

Un int[][] est un tableau de tableaux : g.length est le nombre de lignes, g[i].length le nombre de colonnes de la ligne i (les lignes peuvent avoir des longueurs différentes). On le parcourt avec deux boucles imbriquées ; voir Tableaux 2D pour le raisonnement général.

Matrice.java
public class Matrice {
    public static void main(String[] args) {
        int[][] g = {{1, 2, 3}, {4, 5, 6}};

        for (int i = 0; i < g.length; i++) {
            for (int j = 0; j < g[i].length; j++) {
                System.out.print(g[i][j] + " ");
            }
            System.out.println();
        }
    }
}
Affichage
1 2 3
4 5 6

Un algorithme classique : le tri à bulles

Les deux boucles imbriquées et l'échange de deux cases via une variable temporaire sont ceux de la fiche NSI Tri à bulles.

TriBulles.java
import java.util.Arrays;

public class TriBulles {
    public static void main(String[] args) {
        int[] t = {5, 1, 4, 2};

        for (int passe = 0; passe < t.length - 1; passe++) {
            for (int j = 0; j < t.length - 1 - passe; j++) {
                if (t[j] > t[j + 1]) {
                    int tmp = t[j];
                    t[j] = t[j + 1];
                    t[j + 1] = tmp;
                }
            }
        }
        System.out.println(Arrays.toString(t));
    }
}
Affichage
[1, 2, 4, 5]

length, length() ou size() ?

ObjetTailleExemple
tableaulength (attribut, sans parenthèses)t.length
Stringlength() (méthode)mot.length()
ArrayListsize() (méthode)liste.size()

⚠️ Erreurs fréquentes

Sortir des limites du tableau

Lire ou écrire t[t.length] (ou t[-1]) lève une ArrayIndexOutOfBoundsException. Le programme s'arrête avec le numéro de ligne : lis le message, il indique l'indice fautif et la taille. L'erreur classique est un <= à la place de < dans la boucle.

Afficher un tableau directement

À éviter
Faux.java
System.out.println(t);   // affiche [I@1b6d3586 (une adresse)
Correct
Correct.java
System.out.println(Arrays.toString(t));   // [1, 2, 3]

Croire que b = a copie le tableau

Après int[] b = a;, modifier b[0] modifie aussi a[0]. Pour copier : a.clone() ou Arrays.copyOf(a, a.length).

Comparer deux tableaux avec ==

À éviter
Faux.java
if (a == b) { … }               // compare les références
Correct
Correct.java
if (Arrays.equals(a, b)) { … }   // compare le contenu

t.length() au lieu de t.length

Pour un tableau, length est un attribut : t.length() ne compile pas. L'inverse est vrai pour un String (mot.length()).

Un tableau d'objets rempli de null

String[] noms = new String[3]; crée trois cases qui valent null. Appeler noms[0].length() lève une NullPointerException : remplis chaque case avant de l'utiliser.

Vouloir agrandir un tableau

La taille d'un tableau ne change jamais. Pour une suite qui grandit, utilise une ArrayList (voir Collections).

📋 Aide-mémoire

  • int[] t = new int[n]; (cases à 0) ou int[] t = {1, 2, 3}; ; taille : t.length.
  • Indices de 0 à t.length - 1 ; Java lève une exception si on en sort.
  • for (int i = 0; i < t.length; i++) ou for (int x : t).
  • b = a ne copie pas : a.clone() / Arrays.copyOf ; Arrays.equals compare le contenu.
  • Arrays.toString, Arrays.sort, Arrays.fill ; int[][] g : g.length lignes, g[i].length colonnes.
  • t.length (tableau), s.length() (String), liste.size() (ArrayList).