Les tableaux (array en anglais) sont très utilisés en programmation car ils permettent d'organiser les données. À partir du moment où un programme doit manipuler un grand nombre de données, il est intéressant de les rassembler dans des tableaux. Par exemple, pour un programme chargé de retenir les noms et prénoms des étudiants d'une faculté, il n'est pas intéressant de déclarer une variable de type String pour chaque étudiant car celà prendrait un certain temps et les tableaux vont nous aider.
Indices
Un tableau est donc une liste de valeurs. Chacune des valeurs est stockée dans le tableau à une position bien précise appelée indice. La figure j8.1 montre un tableau appelé temperature qui contient des nombres entiers. En Java, la première position dans le tableau est celle d'indice 0. Le tableau temperature possède 6 valeurs dont les indices vont de 0 à 5.
Pour accéder à une valeur du tableau, on utilise le nom du tableau suivi de l'indice entre crochets. Par exemple, pour accéder à la quatrième température du tableau, il suffit d'écrire :
listing j8.1 Accéder à une valeur d'un tableau
La valeur sera donc 19. L'expression temperature[3] a donc comme valeur 19. L'indice d'un tableau est un simple entier, il est donc possible d'utiliser des variables ou constantes entre crochets comme le montre l'exemple ci-dessous :
| | int pos = 3; | | System.out.println (temperature[pos]); |
|
listing j8.2 Valeur d'une variable comme indice d'un tableau
Déclarer et utiliser les tableaux
En Java, les tableaux sont des objets, et donc pour créer un nouveau tableau, il faudra utiliser l'opérateur new. Pour créer le tableau de la figure j8.1, il suffit d'écrire la ligne de code suivante :
| | int[] temperature = new int[6]; |
|
listing j8.3 Déclaration et création d'un tableau
Celà signifie simplement qu'on déclare une variable dont le nom est temperature, dont le type est int[] (tableau d'entiers de type primitif int). Ensuite, on assigne un nouvel objet à cette variable. L'objet est un tableau de 6 entiers (int[6]).
On remarque donc qu'un tableau contient plusieurs valeurs mais elles doivent toutes avoir le même type. On ne pourrait pas créer un tableau qui contiendrait des int et des double par exemple. De plus, la taille du tableau est décidée et fixée lors de la déclaration, cette taille ne pourra pas changer. On dit qu'on a un tableau statique (Rien à voir avec les classes statiques ou le mot réservé static).
| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 11 | | 12 | | 13 | | 14 | | 15 | | 16 | | 17 | | 18 | | 19 | | 20 | | 21 |
| | public static void main (String[] args) | | { | | final int MAX = 10; | | | | int[] list = new int[MAX]; | | | | | | for (int i = 0; i < MAX; i++) | | { | | list[i] = i * 10; | | } | | | | | | list[3] = 999; | | | | | | for (int i = 0; i < MAX; i++) | | { | | System.out.print (list[i] + " "); | | } | | } |
|
listing j8.4 Utilisation d'un tableau
Ce qui donnera à la console lors de l'exécution ceci :
0 10 20 999 40 50 60 70 80 90
Cet exemple montre également une bonne utilisation des constantes, en effet, si on veut un tableau de taille 15, il 'y a qu'une ligne de code à changer, il suffit de changer la valeur de la constante MAX. Les crochets utilisés pour accéder à un élément d'un tableau sont un opérateur Java comme + ou =. Cet opérateur à la plus haute priorité et sera donc exécuté en premier.
L'opérateur d'indexation de tableau ([]) vérifie automatiquement si l'indice est correct, c'est à dire s'il est positif et plus petit que la taille du tableau - 1. Si tel n'est pas le cas, une erreur d'exécution se produira.
| | int[] tab = new int[2]; | | | | tab[0] = 0; | | tab[1] = 1; | | | | System.out.println (tab[1]); | | System.out.println (tab[2]); |
|
listing j8.5 Erreur d'indice
L'exécution de ce code produira la sortie suivante à la console :
1
java.lang.ArrayIndexOutOfBoundsException: 2
at Test.main(Test.java:18)
Exception in thread "main"
Étant donné que le premier indice est 0, il arrive souvent des erreurs d'indice trop élevé d'une position, le programmeur doit être vigilant et s'assurer que les indices restent dans les limites du tableau.
La taille d'un tableau est contenue dans une variables d'instante de l'objet tableau dont le nom est length. Donc, pour connaitre la taille d'un tableau, il suffit de consulter le contenu de cette variable à l'aide de l'opérateur d'accès point ..
| | int[] tab = new int[5]; | | | | System.out.println (tab.length); |
|
listing j8.6 Taille d'un tableau
Autre syntaxe
Il existe en réalité deux manières de déclarer un tableau en Java. La première que nous avons recontrée est de mettre les crochets avec le type de donnée stocké dans le tableau. On peut également associer les crochets au nom de la variable. Les deux déclarations suivantes sont identiques.
listing j8.7 Syntaxe de déclaration de tableau
Regardons de plus près les deux exemples suivant :
| | int total, somme, resultat; | | int[] tab1, tab2, tab3; |
|
listing j8.8 Déclaration multiple
Dans les deux cas, le type de donnée est appliqué à toutes les variables qui suivent. Si l'on utilise la seconde notation, celà peut mener à des confusions, par exemple dans la ligne de code ci-dessous, tab1 et tab3 sont des tableaux tandis que tab2 est un simple entier. Est-ce une erreur du programmeur ou est-ce volontaire ? C'est plutôt confus.
| | int tab1[], tab2, tab3[]; |
|
listing j8.9 Déclaration multiple (2)
Liste d'initialisation
Il existe une deuxième manière d'instancier un tableau, il s'agit de donner directement les valeurs qu'il contient. On va affecter une
liste d'initialisation ou initialisateur au tableau. Les éléments du tableau sont repris entre des accolades et séparés par des virgules. Par exemple, pour créer le tableau de la figure j8.1, on pourrait écrire :
| | int[] temperature = {20, 17, 21, 19, 18, 20}; |
|
listing j8.10 Initialisateur
On ne peut utiliser une liste d'initialisation que pour la première déclaration, de plus on ne peut le faire que combiné avec la déclaration de la variable, impossible de le faire en deux étapes. Par exemple, le code ci-dessous produit une erreur de compilation.
| | int[] tab = new int[3]; | | | | tab = {1, 2, 3}; |
|
listing j8.11 Initialisateur : erreur de compilation
java.lang.Error: Unresolved compilation problem:
Array constants can only be used in initializers
at Test.main(Test.java:14)
Exception in thread "main"
Parcours de tableau
Pour parcourir complètement ou partiellement un tableau, il suffit simplement d'utiliser une boucle for. Voici un exemple qui parcoure complètement un tableau pour l'afficher à la console :
| | double[] tab = {1.4, 9.2, 10.4}; | | | | for (int i = 0; i < tab.length; i++) | | { | | System.out.println (tab[i]); | | } |
|
listing j8.12 Parcours de tableau
Il ne faut pas oublier que le premier indice du tableau est 0, ensuite on parcoure toutes les positions jusqu'à atteindre tab.length - 1.
Boucle for améliorée 
Java 5.0 offre une nouvelle boucle for qui permet de facilement parcourir tous les objets qui représentent des collections d'objets. Le listing suivant donne la syntaxe de cette boucle for.
| | for (type_de_donnée nom_variable : collection_à_parcourir) | | { | | | | } |
|
listing j8.13 Boucle for améliorée
On précise donc un nom pour une variable locale qui représentera l'élément en cours et on précise la collection qu'il faut parcourir. Voici l'exemple du listing j8.12 avec la boucle for améliorée.
| | double[] tab = {1.4, 9.2, 10.4}; | | | | for (double nb : tab) | | { | | out.println (nb); | | } |
|
listing j8.14 Parcours de tableau avec la boucle for améliorée
Il ne faut même plus se soucier de la taille du tableau, cette boucle for s'occupe de parcourir tous les éléments du tableau, les plaçant tour à tour dans la variable locale spécifiée.
Passer des tableaux en paramètre
On peut passer un tableau complet en paramètre à une méthode car les tableaux ne sont rien d'autre que des objets. Il ne faut donc pas oublier que ce qui sera donné à la méthode n'est pas le tableau, ni une copie de celui-ci mais bien une copie de la référence vers le tableau.
On peut bien entendu également passer en paramètre un seul élément d'un tableau. Si c'est une donnée primitive, une copie de celle-ci sera passée en paramètre, et si c'est un objet, une copie de la référence sera passée en paramètre.
Comme on l'a déjà vu au chapitre 6, si la méthode change la valeur primitive, ça n'aura aucun impact sur l'appelant de la méthode, pareillement si elle change la référence mais si elle utilise la référence pour changer l'objet, il sera changé.
La méthode ci-dessous déplace tous les élément du tableau d'une position vers la droite.
| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 11 | | 12 | | 13 | | 14 | | 15 | | 16 | | 17 | | 18 | | 19 | | 20 | | 21 | | 22 | | 23 | | 24 | | 25 | | 26 | | 27 | | 28 | | 29 | | 30 |
| | public static void main (String[] args) | | { | | int[] tab = {1, 2, 3, 4}; | | | | print (tab); | | moveRight (tab); | | print (tab); | | } | | | | private static void moveRight (int[] tab) | | { | | int last = tab[tab.length - 1]; | | | | for (int i = tab.length - 1; i > 0; i--) | | { | | tab[i] = tab[i - 1]; | | } | | | | tab[0] = last; | | } | | | | private static void print (int[] tab) | | { | | for (int i = 0; i < tab.length; i++) | | { | | System.out.print (tab[i] + " "); | | } | | | | System.out.println(); | | } |
|
listing j8.16 Tableaux en paramètre
L'exécution du code du listing j8.16 affichera donc à la console ceci :
1 2 3 4
4 1 2 3