1 Introduction
Jusqu’ici, nous avons employé les variables pour stocker les valeurs individuelles de types
primitifs : une variable de type int pour stocker un entier, une variable de type boolean pour un
booléen, etc.
Un tableau est une structure regroupant plusieurs valeurs de même type, chacune étant stockée
dans un espace particulier appelé une case du tableau. On peut traiter un tableau comme un
tout, ou case par case. Traité comme un tout, on pourra le stocker dans une variable, le passer
en paramètre ou le donner en résultat d’un calcul. Chaque case est désignée individuellement
via son indice, qui correspond à sa position dans le tableau, et peut être traitée comme variable
individuelle : on pourra consulter sa valeur, la modifier, etc.
type [] nomTab ;
type nomTab[];
2
L’utilisation de l’une ou l’autre de ces syntaxes est une affaire de goût personnel.
p Exemple:
int[] tab; //Déclaration d’un tableau d’entiers
char tab1[],tab2[];//Déclaration de 2 tableaux de caractères
Remarquez que la taille du tableau n’est pas spécifiée. La déclaration d’un tableau ne lui
alloue pas de mémoire. Dans la plupart des autre langages, la taille du tableau doit être indiquée
dans la déclaration, mais dans Java, vous ne spécifiez pas sa taille jusqu’au moment ou vous
l’utilisez. La mémoire appropriée est alors allouée.
p Exemple:
int tab [5];//Erreur ne compile pas
2. 2 Création de tableaux
Notez que la taille d’un tableau ne fait pas partie de sa déclaration. La création (donc allouer
réellement de la mémoire) devra donc indiquer la taille du tableau. La syntaxe à employer est la
suivante:
La taille du tableau est déterminée par l’expression entre crochets qui doit avoir une valeur
entière positive. Une fois qu’un tableau est créé, sa taille ne peut plus modifier.
Java initialise automatiquement les éléments des tableaux, avec la valeur 0 pour les primi-
tives entières (byte, short, int et long), 0.0 pour les primitives flottantes (float et double), false
pour les boolean et null pour les objets et les tableaux.
2 Les tableaux à une dimension 3
p Exemple:
int [] tb = new int[3];
char [] ch = new char[4];
boolean [] bt = new boolean[3];
p Exemple:
char[] voyelles= {’a’,’e’,’i’,’o’,’u’,’y’};
Cette instruction crée un tableau de type char de 6 éléments appelé voyelles. Elle initialise
les éléments du tableau avec les 6 voyelles. Nous n’avons pas eu besoin d’utiliser l’opérateur
new pour créer ce tableau ; et enfin, les caractères ’a’,’e’,’i’,’o’,’u’, et ’y’ sont affectés aux élé-
ments voyelles[0], voyelles[1], voyelles[2], voyelles[3] , voyelles[4] et voyelles[5], la mémoire
nécessaire est automatiquement affectée au tableau pour y mettre les valeurs initialisées.
Les tableaux littéraux peuvent contenir des variables, comme dans l’exemple suivant :
p Exemple:
int a = 1, b = 2, c = 3, d = 4, e = 5;
int[] y = {a, b, c, d, e};
p Exemple:
byte a = 1;
short b = 2;
char c = 3;
int d = 4;
long e = 5;
long[] y = {a, b, c, d, e};
Cela n’est cependant possible que grâce à la particularité suivante : comme avec les opéra-
teurs, tous les éléments d’un tableau littéral sont sur-castés vers le type supérieur. Ici, bien que
chaque variable soit d’un type différent, tous les éléments du tableau littéral {a, b, c, d, e} sont
des long, ayant subi un sur-casting implicite vers le type de l’élément le plus long.
Une fois le tableau initialisé, on accède aux éléments du tableau à l’aide de la syntaxe
suivante :
nomTab [indice]
p Exemple:
int[] tabCinq = {2,4,6,8,10};
int i = 0;
int x = tabCinq[i]; //x= 2, l’élément d’indice 0
int y = tabCinq[4]; //y= 10, l’élément d’indice 4
2 Les tableaux à une dimension 5
On modifie le contenu d’une case avec la construction d’affectation. Ainsi pour mettre à 0
la deuxième case du tableau tabCinq, on écrira tabCinq[1] = 0;
Une fois le tableau initialisé, il est possible à tout moment de connaître sa taille(son nombre de
cases) à l’aide de la variable d’instance length.
p Exemple:
int longueur = tabCinq.length;// longueur vaut maintenant 5.
Ce programme affiche:
tab[0] = 10
. tab[1] = 20
. tab[2] = 30
. tab[3] = 40
6
Une erreur commune dans une boucle, est de fixer le dernier indice à i <= tab.length plutôt
qu’à i <= tab.length − 1. Si nous changeons la condition de la boucle de cette manière,
l’exécution produit une erreur : l’indice tab.length, égal à 4 ici, n’existe pas dans tab.
. tab[0] = 10
. tab[1] = 20
. tab[2] = 30
. tab[3] = 40
. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
On souhaite initialiser un tableau avec des notes d’étudiants saisies au clavier. Le pro-
gramme demande le nombre de notes à saisir, et crée un tableau notes de cette taille. Une
première boucle initialise le tableau ; la boucle suivante affiche son contenu. Les itérations se
font dans l’intervalle de i = 0 jusqu’à i <= notes.length − 1.
import java.util.Scanner;
public class AffichageNotes {
. public static void main (String args[]) {
. Scanner clav=new Scanner(System.in);
. System.out.println("Nombre de notes à lire? ");
. int N = clav.nextInt();
. double [] notes = new double[N];
. // Initialisation
. for (int i=0; i< notes.length; i++) {
. System.out.println("Note no. "+(i+1)+"? ");
. notes[i] = clav.nextDouble();
. }
. // Affichage
. System.out.println("Notes dans le tableau:");
. System.out.println("**********************");
. for (int i=0; i< notes.length; i++){
. System.out.println("Note no. " + (i+1) + " = ");
. System.out.println(notes[i]);
. }
. }
}
2 Les tableaux à une dimension 7
for (type elem : nomTab) {Instructions} // Le symbole ":" se lit "in" ("dans").
p Exemple:
public class TestForeach{
. public static void main(String[] args){
. int tab[]={2,0,3,0,5,0,7};
. for (int elem : tab){
. if (elem!=0)
. System.out.println("# de 0");
. else
. System.out.println("= 0");
. }
. }
}
Cette nouvelle syntaxe ne remplace pas la syntaxe de base (elle la simplifie dans certaines
situations particulières).
2. 6 Copier un tableau
Pour copier un tableau, on utilise l’opération suivante:
System.arraycopy(source, positionSrc, destination, positionDst, nombre);
å source : tableau source.
å positionSrc : position de départ pour le tableau source.
å destination : tableau destination.
å positionDst : position de départ pour le tableau destination.
å nombre : nombre d’éléments à copier.
p Exemple:
System.arraycopy(src, 0, dst, 2, 5); //copie les 5 premiers éléments de src dans
. //dst à partir de l’indice 2.
8
p Exemple:
int[] tab2= Arrays.copyOf(t, 5); // copie des 5 premiers éléments.
int[] tab3= Arrays.copyOfRange(t, 2, 5); // copie entre les indices 2 à 5.
La méthode clone() peut aussi être utilisée pour copier le contenu d’un tableau.
p Exemple:
int[] tab3 = tab2.clone();
p Exemple :
public static void main(String[] args){
. int[] tab1 = {0,1,2,3};
. int max = maximum(tab1);
. System.out.println("Le maximum de nombres est : " + max);//3
. }
public static int maximum(int[] tab2){
. int max = tab2[0];
. for (int i=1; i<tab2.length; i++)
. {
. if (tab2[i]>max)
. max = tab2[i];
. }
. return max;
. }
2 Les tableaux à une dimension 9
p Exemple:
public static void main(String[] args){
. int[] tab1 = {0,1,2,3};
. int max = maximum(tab1);
. System.out.println("Le maximum de nombres est : "+ max);//42
. }
public static int maximum(int[] tab2){
.. tab2[2]=42;
.. int max = tab[0];
. for (int i=1; i<tab2.length; i++)
. {
. if (tab2[i]>max)
. max = tab2[i];
. }
. return max;
. }
p Exercice:
Soit la méthode suivante:
void changement(int[] t1,int[] t2){
. t1 =t2;
10
. t1[0] = t2[t2.length-1];
. }
Et les déclarations et instructions suivantes:
int[] numero = {1,3,4,5};
int[] num={4,3,6};
changement(numero, num);
Que contiennent les tableaux numero et num après cet appel?
p Syntaxe:
type [] [] nomTab; ou type nomTab[] [];
p Exemple:
int [][] x = {{0, 0,0, 0},
. {0, 1, 2, 3},
. {0, 2, 4, 6},
. {0, 3, 6, 9}};
p Exemple:
double[][] Tab ; // Déclaration d’un tableau à 2 dimensions de réels
Tab = new double[2][3]; // Création d’un tableau contenant 2 tableaux de
. // 3 réels chacun. Tab a donc 2 lignes et 3 colonnes.
Pour accéder à tous les éléments du tableau, vous devez utiliser des boucles imbriquées :
3 Les tableaux à plusieurs dimensions 11
p Exemple:
int [][] mat = new int [2][3] ;
for (int i=0;i<mat.length;i++)
. for (int j=0;j<mat[i].length;j++)
. mat[i][j] = i*j;
p Remarque:
å En fait, la syntaxe : int [][] tab = new int[2][3];
crée un tableau de deux tableaux. Ces deux tableaux ont tous trois éléments.
å mat.length: représente le nombre des tableaux=2.
å mat[i].length: représente la taille de chaque tableau=3.
p Exemple:
int [][] tab = {{1},
. {2, 3},
. {4, 5, 6}};
ou en losange :
p Exemple:
int [][] x = {{1},
. {2, 3},
. {4, 5, 6},
. {7, 8},
. {9}};
Si vous voulez utiliser l’opérateur new pour créer des tableaux non rectangulaires, il faut
initialiser séparément chaque sous-tableau. Pour créer le tableau en triangle de l’exemple pré-
cédent, vous pouvez procéder de la façon suivante :
p .
int [][] tab = new int[3][];
for (int i = 0; i < 3; i++)
. tab[i] = new int[i + 1];