2.
Les tableaux
21
Les tableaux représentent des collections de valeurs ou
d’objets. En Java, les tableaux sont eux-mêmes des
objets.
Donc une variable de type tableau peut avoir la
valeur null.
Une variable de type tableau se déclare en ajoutant des
crochets à la suite du type :
int[] tableau;
2. Les tableaux
22
Initialisation
Il est possible d’initialiser une variable de type tableau à partir
d’une liste fixe délimitée par des accolades.
int[] tableauEntier = {1, 2, 3, 4, 5};
String[] tableauChaine = {"Bonjour", "le", "monde"};
2. Les tableaux
23
Création avec new
Les tableaux étant des objets, il est également possible de les créer
avec le mot-clé new.
int[] tableauEntier = new int[] {1, 2, 3, 4};
String[] tableauChaine = new String[] {"Bonjour", "le", "monde"};
2. Les tableaux
24
Création avec new
Si on ne souhaite pas donner de valeurs d’initialisation pour les
éléments du tableau, il suffit d’indiquer uniquement le nombre
d’éléments du tableau entre crochets.
int[] tableauEntier = new int[5];
String[] tableauChaine = new String[3];
2. Les tableaux
25
Création avec
new Valeur par défaut d’un élément d’un tableau
Type Valeur d’initialisation
boolean false
Dans ce cas, les
char '\0'
éléments d’un
byte 0
tableau sont tout
short 0
de même
int 0
initialisés avec une
long 0
valeur par défaut
float 0.0
(comme pour un
double 0.0
attribut) :
référence d’objet null
2. Les tableaux
26
Création avec new
La taille du tableau peut être donnée par une constante, une
expression ou une variable.
int t = 6; int[] tableau = new int[t * t * 2];
2. Les tableaux
27
Création avec new
Par contre, la taille d’un tableau est donné à sa création et ne peut
plus être modifiée.
Il n’est donc pas possible d’ajouter ou d’enlever des éléments à un
tableau.
Dans ce cas, il faut créer un nouveau tableau avec la taille voulue et
copier le contenu du tableau d’origine vers le nouveau tableau.
2. Les tableaux
28
Création avec new
Un tableau dispose de l’attribut length permettant de connaître sa
taille. L’attribut length ne peut pas être modifié.
int t = 6; int[] tableau = new int[t * t * 2];
[Link]([Link]); // 72
2. Les tableaux
29
Accès aux éléments d’un tableau
L’accès aux éléments d’un tableau se fait en donnant l’indice d’un
élément entre crochets. Le premier élément d’un tableau a
l’indice 0. Le dernier élément d’un tableau a donc comme indice la
taille du tableau moins un.
int[] tableau = {1, 2, 3, 4, 5};
int premierElement = tableau[0];
int dernierElement = tableau[[Link] - 1];
2. Les tableaux
30
Accès aux éléments d’un tableau
Il est possible de parcourir tous les éléments d’un tableau avec
un for amélioré.
int[] tableau = {1, 2, 3, 4, 5};
for (int v : tableau) { [Link](v); }
L’utilisation d’un for amélioré est préférable lorsque cela est
possible. Par contre, il n’est pas possible avec un for amélioré de
connaître l’indice de l’élément courant.
2. Les tableaux
31
Accès aux éléments d’un tableau
Si le programme tente d’accéder à un indice de tableau trop grand
(ou un indice négatif), une erreur de type survient.
int[ ] tableau = {1, 2, 3, 4, 5};
int value = tableau[1000]; // ERREUR À L'EXÉCUTION
2. Les tableaux
32
Tableau multi-dimensionnel
Il est possible d’initialiser un tableau à plusieurs dimensions.
int[ ][ ] tableauDeuxDimensions = {{1, 2}, {3, 4}};
int[ ][ ][ ] tableauTroisDimensions = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
[Link](tableauDeuxDimensions[0][1]);
[Link](tableauTroisDimensions[0][1][0]);
2. Les tableaux
33
Tableau multi-dimensionnel
Il est également possible de créer un tableau multi-dimensionnel
avec le mot-clé new.
int[ ][ ] tableauDeuxDimensions = new int[2][10];
int[ ][ ][ ] tableauTroisDimensions = new int[2][10][5];
2. Les tableaux
34
Tableau multi-dimensionnel
Il n’existe pas réellement de type tableau multi-dimensionnel.
Le compilateur le traite comme un tableau de tableaux.
Il est donc autorisé de déclarer des tableaux sans préciser les
dimensions au delà de la première et d’affecter ensuite des tableaux à
chaque valeur.
Ces tableaux peuvent d’ailleurs avoir des tailles différentes.
int[ ][ ] tableauDeuxDimensions = new int[2][ ];
tableauDeuxDimensions[0] = new int[10];
tableauDeuxDimensions[1] = new int[5];
2. Les tableaux
35
Conversion en chaîne de caractères
Si on affiche un tableau sur la sortie standard, vous serez
certainement surpris.
int[] tableau = {1, 2, 3, 4, 5}; [Link](tableau);
La code précédent affichera sur la sortie standard quelque chose
comme ceci :
[I@ee7d9f1
2. Les tableaux
36
Conversion en chaîne de caractères
Pour obtenir une chaîne de caractères donnant le contenu du
tableau, il faut utiliser la classe outil [Link] qui contient
des méthodes de classe toString adaptées pour les tableaux.
int[] tableau = {1, 2, 3, 4, 5};
[Link]([Link](tableau));
2. Les tableaux
37
Égalité de deux tableaux
En Java, il n’est pas possible d’utiliser l’opérateur == pour
comparer deux objets. En effet, cet opérateur compare la référence
des variables. Cela signifie qu’il indique true uniquement si les
deux variables référencent le même objet.
int[] tableau1 = {1, 2, 3, 4, 5};
int[] tableau2 = {1, 2, 3, 4, 5};
[Link](tableau1 == tableau1); // true
[Link](tableau1 == tableau2); // false
2. Les tableaux
38
Égalité de deux tableaux
La classe outil [Link] fournit des méthodes de
classe equals pour comparer des tableaux en comparant un à un
leurs éléments.
int[] tableau1 = {1, 2, 3, 4, 5};
int[] tableau2 = {1, 2, 3, 4, 5};
[Link]([Link](tableau1, tableau1)); // true
[Link]([Link](tableau1, tableau2)); // true
2. Les tableaux
39
Tri & recherche
Tout d’abord, [Link] fournit plusieurs méthodes sort.
Celles prenant un tableau de primitives en paramètre trient selon
l’ordre naturel des éléments.
int[] tableau = {1, 5, 4, 3, 2};
[Link](tableau);
[Link]([Link](tableau));
2. Les tableaux
40
Tri & recherche
Il est également possible de trier certains tableaux d’objets. Par
exemple, il est possible de trier des tableaux de chaînes de
caractères.
String[] tableau = {"premier", "deuxième", "troisième", "quatrième"};
[Link](tableau);
[Link]([Link](tableau));
2. Les tableaux
41
Tri & recherche
[Link] fournit des méthodes binarySearch qui
implémentent l’algorithme de recherche binaire.
int[] tableau = {10, 20, 30, 40, 50};
[Link]([Link](tableau, 20)); // 1
[Link]([Link](tableau, 45)); // -5
2. Les tableaux
42
Copie d’un tableau
[Link] fournit des méthodes de
classe copyOf et copyOfRange pour réaliser des copies de tableaux.
int[] tableau = {1, 2, 3, 4, 5};
int[] nouveauTableau = [Link](tableau, [Link] - 1);
[Link]([Link](nouveauTableau)); // [1, 2, 3, 4]
nouveauTableau = [Link](tableau, [Link] + 1);
[Link]([Link](nouveauTableau)); // [1, 2, 3, 4, 5, 0]
nouveauTableau = [Link](tableau, 2, [Link]);
[Link]([Link](nouveauTableau)); // [3, 4, 5]
nouveauTableau = [Link](tableau, 2, 3);
[Link]([Link](nouveauTableau)); // [3]
2. Les tableaux
43
Copie d’un tableau
Pour réaliser une copie, il existe également la Méthode
[Link]. Contrairement aux précédentes, cette
méthode ne crée pas de nouveau tableau, elle copie d’un tableau
existant vers un autre tableau existant.
int[] tableau = {1, 2, 3, 4, 5};
int[] destination = new int[3];
[Link](tableau, 1, destination, 0, [Link]);
[Link]([Link](destination)); // [2, 3, 4]
2. Les tableaux
44
Typage d’un tableau
Un tableau est un objet. Cela implique qu’il respecte les règles de
typage du langage. Ainsi on ne peut mettre dans un tableau que
des valeurs qui peuvent être affectées au type des éléments
String[] tableau = new String[10];
tableau[9] = "Bonjour"; // OK
tableau[8] = new Voiture(); // ERREUR DE COMPILATION
2. Les tableaux
45
Conversion d’un tableau en liste
Pour transformer un tableau d’objets en liste, on utilise la
méthode [Link].
La liste obtenue possède une taille fixe. Par contre le contenu de la
liste est modifiable, et toute modification des éléments de cette
liste sera répercutée sur le tableau.
String[] tableau = {"Bonjour", "le", "monde"};
[Link]<String> liste = [Link](tableau);
[Link](0, "Hello"); [Link](1, "the"); [Link](2, "world");
[Link]([Link](tableau)); // [Hello, the, world]