certification java

OCPJP 6 – Jour 9 – Les tableaux

En programmation, on parle de tableau pour désigner un ensemble d’éléments de même type désignés par un nom unique, chaque élément étant repéré par un indice précisant sa position au sein de l’ensemble.
Comme tous les langages, Java permet de manipuler des tableaux mais nous verrons qu’il fait preuve d’originalité sur ce point. En particulier, les tableaux sont considérés comme des objets et les tableaux à plusieurs indices s’obtiennent par composition de tableaux.

9.1 – Tableau à une dimension

9.1.1 – Déclaration

La déclaration d’une référence à un tableau précise simplement le type des éléments du tableau. Elle peut prendre deux formes différentes. La déclaration suivante :

est équivalente à :

En fait, la différence entre les deux formes devient perceptible lorsque l’on déclare plusieurs identificateurs dans une même instruction. Ainsi,

est équivalent à :

La déclaration recommandée, pour une question de lisibilité et de moyen mnémotechnique (même fonctionnement que les ellipses), est de mettre les crochets juste après le type du tableau.

A la déclaration d’un tableau, la JVM n’a pas encore alloué d’espace mémoire. La variable t ainsi déclarée est une référence et, pour le moment, elle ne référence rien.

Une déclaration de tableau ne doit pas préciser de dimensions. Cette instruction sera rejetée à la compilation :

9.1.2 – Création

opérateur new()

On crée un tableau comme on crée un objet, c’est-à-dire en utilisant l’opérateur new. On précise à la fois le type des éléments, ainsi que leur nombre :

Cette instruction alloue l’emplacement nécessaire à un tableau de 5 éléments de type int et en place la référence dans t. Les 5 éléments sont initialisés avec une valeur par défaut (0 pour un int). On peut illustrer la situation par ce schéma :

OCPJP_Tableaux

Lors de la création, les éléments d’un tableau sont toujours initialisés avec des valeurs par défaut :

  • les booléens sont initialisés à false
  • les numériques sont initialisés à 0
  • les caractères sont initialisés avec un caractère nul ‘\0’
  • les objets sont initialisés à null.

Il est évidemment possible de déclarer et de créer un tableau sur une même ligne :

Il est important de noter que, dans le deuxième exemple, aucun objet de type Thread n’est créé mais un simple objet tableau contenant 5 valeurs nulles.

La taille doit toujours être spécifiée dans la création du tableau :

Les tableaux en Java sont de taille fixe. Une fois le tableau créé, l’espace qui lui est alloué en mémoire ne peut pas changer. En revanche, comme n’importe quelle référence à un objet, la référence contenue dans t pourra très bien évoluer au fil de l’exécution et désigner finalement des tableaux différents.


Initialiseur

Un initialiseur est l’affectation d’un attribut simultanément à sa définition. Lors de la déclaration d’un tableau, il est possible de fournir une liste d’expressions entre accolades, comme dans :

Cette instruction crée un tableau de 3 entiers ayant les valeurs des expressions mentionnées et en place la référence dans t. Elle remplace les instructions suivantes :

Java se sert du nombre d’expressions figurant dans l’initialiseur pour en déduire la taille du tableau à créer. La taille du tableau ne doit pas être spécifiée. Notez que ces expressions n’ont pas besoin d’être des expressions constantes ; il suffit simplement qu’elles soient calculables au moment où l’on exécute l’opérateur new.
La notation entre accolades n’est utilisable que dans une déclaration. L’instruction suivante est incorrecte :


Tableau anonyme


Un tableau dit anonyme est un tableau non assigné à une variable et destiné à ne servir qu’une seule fois. Par exemple, un tableau anonyme peut être déclaré et créé dans l’unique but de figurer dans l’appel d’une méthode :

La taille du tableau ne doit pas être spécifiée. Tout comme avec un initialiseur, Java se sert du nombre d’expressions pour en déduire la taille du tableau à créer.

9.1.3 – Affectation d’éléments

Java permet aussi de manipuler globalement des tableaux, par le biais d’affectations de leurs références :

Le tableau peut être instancié via une boucle :

Le champ length permet de connaître le nombre d’éléments d’un tableau mais il faut noter qu’on écrit length et non length() car ce n’est pas une méthode mais un champ public.

Il est très important de ne pas dépasser la capacité du tableau sous peine d’obtenir une exception de type ArrayIndexOutOfBoundsException :

Primitifs

Un tableau accepte tout type de primitif pouvant être converti implicitement vers le type du tableau. Par exemple un tableau de type int accepte tout autre primitif pouvant contenir dans 32bits :

Objets

Si un tableau est déclaré de type A, alors ce tableau pourra être instancié avec des objets de type A mais aussi avec n’importe quel objet appartenant à une sous-classe de A :

De même la référence d’un tableau peut être de type interface. Or, comme nous l’avons vu précédemment, une interface est une classe 100% abstraite et celle-ci ne peut être instanciée. Un tableau de type interface ne peut être instancié que par des objets dont la classe implémente cette interface.

9.1.4 – Affectation de références de tableaux

Il est très important de noter que l’affectation de références de tableaux n’entraîne aucune recopie des valeurs des éléments du tableau. On retrouve exactement le même phénomène que pour l’affectation d’objets :

OCPJP_Tableaux_2

OCPJP_Tableaux_3

Ceci implique qu’une modification de t1 entrainera une mise à jour de t2 et inversement.

Primitifs

Contrairement à l’affectation d’éléments dans un tableau, les références des deux tableaux doivent être exactement de même type :


Objets

Comme l’affectation d’éléments de type objet dans un tableau, une référence de type A est seulement compatible avec une référence de type A ou une référence d’une sous-classe de A :

Un tableau de type Plane peut être assigné à un tableau de type Aircraft car Plane est une sous-classe de Aircraft. Un avion (Plane) « est un » aéronef (Aircraft). Cependant, l’inverse est faux. En effet un tableau de type Aircraft ne peut être assigné à un tableau de type Plane. Un aéronef (Aircraft) n’est pas forcément un avion (Plane).

De même pour un tableau de type interface, une référence de type interface est seulement compatible avec une référence d’une classe implémentant cette interface :

8.2 – Tableau à plusieurs dimensions

8.2.1 – Déclaration

En Java, les tableaux à plusieurs dimensions sont en fait des tableaux de tableaux. Ces trois déclarations sont équivalentes :

Comme le tableau à une dimension, la déclaration recommandée, pour une question de lisibilité, est de mettre les crochets juste après le type du tableau.

8.2.1 – Création

opérateur new()

La création de tableaux à plusieurs dimensions se fait aussi via l’opérateur new, en donnant en plus du type des éléments, la taille de chaque dimension :

En Java, seule la première dimension est obligatoire :

Ainsi les dimensions des tableaux composant le tableau principal peuvent être spécifiées dans un deuxième temps et chaque dimension peut être différente :

OCPJP_Tableaux_4

Initialiseur


Un initialiseur peut aussi être utilisé avec un tableau à plusieurs dimensions en fournissant une liste d’expressions entre accolades lors de la déclaration du tableau :

Cette instruction crée 4 tableaux : un tableau contenant 3 tableaux d’entiers et chacun des tableaux contenant divers primitifs de type int.

8.2.2 – Affectation de références de tableaux

L’affectation de références de tableaux à plusieurs dimensions fonctionne suivant les mêmes règles que pour un tableau à simple dimension, que ce soit pour des tableaux de type primitif ou type objet.

Mais dans le cas d’un tableau à plusieurs dimensions, un nouveau paramètre est à prendre en compte : la dimension. En effet, une référence ne peut être affectée qu’à une autre référence de même dimension :


Auteur
AuteurEdouard WATTECAMPS

0 réponses

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *