Pour toute suggestion : webmaster@debutantprogjava.com
Comprendre la programmation orientée objet à travers des exemples en java

C.5 Etude de quelques classes prédéfinies 2 :
Vector, Stack, ArrayList et LinkedList
HashTable, HashMap, WeakHashMap et TreeMap
HashSet, LinkedHashSet et TreeSet

Toutes ces classes sont appelées des collections (Remarquez le c miniscule du mot collection).
En toute rigueur, ces sont les objets instanciés à partir de ces classes qui sont des collections. Car ces objets permettent de collectionner (stocker) des objets de types identiques ou non. Pour cette raison, ils ressemblent aux tableaux. Mais avec cette grande différence que la taille des collections peut varier au gré des besoins. Les tableaux quant à eux ont une taille qui ne change pas après qu' on l' ait définie. Les collections vous évitent alors de donner une taille choisie volontairement grande afin de s' assurer qu' on pourra y mettre le nombre d' objets qu' on veut. Ainsi, ils évitent de consommer de la mémoire inutilement.

Ces collections peuvent être répartie en 3 groupes : Les liste - les Maps et les ensembles.

Les listes : Vector, Stack, ArrayList, LinkedList, HashTable.
Elles sont une suite d'éléments ordonnés, accessibles par leur indice (leur position dans la collection).

Les maps : HashMap, WeakHashMap et TreeMap.
Ce sont des tableaux associatifs qui permettent de lier un objet (clé) à un autre objet (valeur). Vous connaissez la clé ? vous retrouvez la valeur. Les clés sont uniques. Mais une valeur peut être associée à plusieur clés.

Les ensembles : HashSet, LinkedHashSet et TreeSet
Ce sont des collections qui vous garantissent l' unicité. On ne trouvera jamais de doublons dans un ensemble.

D' autres classes de type collection existent. Faîtes vous-même vos recherches.



Attention, le mot Collection (remarquez le c majuscule) est le nom d' une classe en java. Une classe prédéfinie, évidement. Mais surtout une classe particulière qu' on appelle interface. Nous verrons les interfaces dans un chapitre qui leur sont dédiées.

Je ne vais pas vous donner des exemples pour toutes ces classes. Mais pour chacune d' elle, je vous donnerai au moins une idée générale.

C.5.1 Les classes Vector, Stack, ArrayList et LinkedList

Les classes Vector et ArrayList, c' est pareil. En fait, ArrayList, c' est du Vector amélioré. La différence entre les 2 ? ... Mon site vise les débutants en java. En tant que débutant, vous n' avez pas besoin de connaître cette différence pour l' instant. Si je vous parle de synchronisation de threads qui crée un problème avec la classe Vector, vous suivez ? ... Alors, contentez-vous de préférer la classe ArrayList plutôt que Vector.
Sachez seulement que Vector est une vielle classe depuis la première version de java. Depuis ArrayList, peu de programmeurs l' utilisent.

Oubliez la classe Vector !

Exemple 1 : 

1.    import java.util.ArrayList;
2.
3.    public class ConstructeursArrayList
4.    {
5.        public static void main (String [] args )
6.        {
7.            ArrayList liste1 = new ArrayList();
8.            ArrayList liste2 = new ArrayList(22);
9.            ArrayList liste3 = new ArrayList(liste1);
10.       }
11.  }

Une nouvelle instruction avant la déclaration de la classe. C' est : import java.util.ArrayList; Qu' est-ce que c' est ?

Lorsque vous installez Java sur votre ordinateur, vous avez des outils qui vous permettent de compiler, d' exécuter vos programmes. Mais vous avez aussi des classes prédéfinies contenant des méthodes, des fonctions vous permettant de résoudre des problèmes. Ces classes sont regroupées en packages. Ce mot est anglais en fait. Les informaticiens francophones ont trouvé un mot équivalent. C' est paquettage. C' est comme si on rangeait ces classes sous formes de paquets. Pourquoi ? Nous le verrons dans le chapitre consacré aux "packages".
Sachez seulement que lorsqu' on utilise une classe prédéfinie, on fait appel à une instruction permettant de préciser au compilateur où se trouve la classe qu' on veut utiliser. Parce qu' il y en a tellement en java. Cette instruction utilise le mot clé import. Puis on énonce le package dans lequel se trouve la classe. La classe ArrayList se trouve dans le package java.util
Ce package contient un grand nombre de classes. Lorsqu' on veut utiliser une classe de ce package, on commence par écrire import java.util.nomDeLaClasse; Ici, c' est ArrayList. Donc, on commence par écrire : import java.util.ArrayList;.
Si vous voulez utiliser 2 classes de ce package, par exemple, ArrayList et Stack, vous commencer par écrire :
import java.util.ArrayList;
import java.util.Stack;
Si, au départ, vous ne connaissez pas le nombre de classes de ce package que vous voulez utiliser, simplifiez vous la tâche en écrivant une seule instruction : import java.util.*;
Le caractère * remplace le nom de n' importe quelle classe du package java.util. En programmation graphique, nous utiliserons cette instruction (import ....) dans tous les programmes sans exception.

La question qui vous brûle les lèvres est naturellement de savoir pourquoi n' a-t-on pas utilisé cette instruction dans tous les programmes qui ont utilisé les classes prédéfinies telles que Math, String, StringBuffer, etc... La réponse est toute simple. Ces classes appartiennent au package java.lang . Exceptionnellement, ces classes n' ont pas besoin d' être importées pour êtres utilisées. Le compilateur va automatiquement les retrouver à chaque programme. C' est le cas de la classe System contenant la méthode d' affichage System.out.print()

Voir toutes les classes du package java.util : java.util

Voir toutes les classes du package java.lang : java.lang

Voir toute les packages : Packages

Maintenant, revenons au programme.
Compilez : il sera affiché :

Note: ConstructeursArrayList.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Chaque fois que vous verrez l' affichage de Note, vous avez affaire à un avertissement. Grosso modo, l' avertissement vous indique qu' il y a mieux comme méthode ou classe. Vous utilisez donc une méthode ou une classe ancienne version. Et c' est justement le cas ici. La classe ArrayList possède une nouvelle version. C' est ArrayList. Ne prononcez pas le . Dîtes plutôt ArrayList générique. La classe ArrayList permet de créer une collection d' objets. N' importe quel objet. Vous pouvez mettre dans un objet ArrayList, aussi bien un objet Cercle, Points2, String, StringBuffer. Avec la classe ArrayList, vous pouvez choisir de ne mettre que des objets provenant de la même classe. Et justement, le E correspond au nom de la classe en question. Si je veux que mon objet ArrayList ne contienne que des objets de type Cercle, le constructeur utilisé en ligne 7 par exemple sera : ArrayList liste1 = new ArrayList();. Si, malgré cette possibilité, vous voulez quand même que votre objet ArrayList contienne des objets de toute nature, alors vous écrivez : ArrayList<Object> liste1 = new ArrayList<Object>();. C' est parce que je n' ai pas utilisé cette forme de ArrayList que j' ai eu cet avertissement (les 2 Note) à la compilation. La première Note veut dire que la classe ConstructeursArrayList.java (exemple ci-dessus) utilise des opération non sécurisées. La deuxième note signifie que si je recompile cette classe avec -Xlint, je verrai les détails. Si vous êtes débutants, ne vous cassez pas la tête avec ça pour l' instant. Pour compiler avec -Xlint, il suffit de faire : javac -Xlint ConstructeursArrayList.java
Le mot Object (remarquez le O majuscule et le c entre e et t ) est le nom d' une classe en java. La classe Object. Tous les objets utilisés en java ( provenant de classes prédéfinies ou non ) appartiennnent à la classe Object. On dit que Object est la mère de toutes les classes en java. Vous comprendrez mieux dans le chapitre Héritage et Polymorphisme.

Le constructeur utilisé en ligne 7 permet d' instancier un objet ArrayList vide (ne contenant aucun objet) avec une capacité initiale de 10. Cela veut dire qu' on peut y mettre 10 objets sans avoir à agrandir son espace mémoire. Souvenez-vous que les collections sont des tableaux dont la taille varie au fur et à mesure des besoins. Mais il faut tout de même lui donner un espace mémoire initial. C' est la capacité. Plus on mettra des objets dans l' ArrayList, plus son espace s' agrandira.
Le constructeur utilisé en ligne 8 permet d' instancier un objet ArrayList avec une capacité initiale préalablement choisie. Ici, j' ai choisi 22.
Le constructeur utilisé en ligne 9 permet d' instancier un objet ArrayList avec comme contenu initial, tous les objets appartenant à une collection. Ici, j' ai choisi d' y mettre tous les objets de la collection liste1. Puisque liste1 est vide, cela veut dire qu' ici, liste3 l' est aussi.

Maintenant, passons aux méthodes. Et cette fosi, nous allons utiliser la bonne classe ArrayList. Autrement dit, la classe ArrayList (ArrayList générique).

Exemple 2 : 

1.    import java.util.ArrayList;
2.
3.    public class MethodesArrayList
4.    {
5.        public static void main (String [] args )
6.        {
7.            ArrayList<Object> liste1 = new ArrayList<Object>();
8.            Cercle A = new Cercle(1, 2, 3);
9.            Points2 P = new Points2();
10.           liste1.add(A);
11.           liste1.add(P);
12.           System.out.println("Le nombre d' objets de liste1 = " + liste1.size() );
13.       }
14.   }

Compilez. Pas de message d' avertissement. Parce que cette fois, j' ai utilisé la classe ArrayList. Exécutez. Il sera affiché :

Le nombre d' objets de liste1 = 2

En ligne 7, j' utilise le constructeur permettant d' instancier un objet ArrayList vide avec une capacité initiale de 10. En ligne 8 : je crée un objet Cercle avec la classe Cercle que vous devez mettre dans le même répertoire que le programme. En ligne 9, je crée un objet Points2 avec la classe Points2 elle aussi dans le même répertoire que le programme (classe MethodesArrayList.java).
Puis en ligne 10 : j' utilise la méthode add() de al classe ArrayList pour ajouter l' objet A dans l' objet ArrayList liste1. Et en ligne 11, j' utilise la méthode add() pour ajouter l' objet P dans l' objet liste1. Le nombre d' objets contenus dans un ArrayList s' obtient grâce à la méthode size() utilisée en ligne 12. D' où l' affichage.

Notez quelque chose d' important. En instanciant l' objet ArrayList (ligne 7) avec une capacité de 10, on définit automatiquement 10 positions qui sont : 0, 1, 2, 3 4, 5, 6, 7, 8 et 9. La méthode add() permet d' ajouter un objet sur la première position inoccupée. Puisque l' objet liste1 a été instancié vide, cette première position est donc 0. L' objet A se trouve forcément en position 0. Et l' objet P se trouve en position 1, forcément.

Exemple 3 : 

1.    import java.util.ArrayList;
2.
3.    public class MethodesArrayList2
4.    {
5.        public static void main (String [] args )
6.        {
7.            ArrayList<Object> liste1 = new ArrayList<Object>();
8.            Cercle A = new Cercle(1, 2, 3);
9.            Points2 P = new Points2();
10.           liste1.add(0, A);
11.           liste1.add(1, P);
12.           System.out.println("Le nombre d' objets de liste1 = " + liste1.size() );
13.       }
14.   }

compilez puis exécutez ce programme. Il sera affiché la même chose que précédement. En effet, C' est la même chose à une exception près. Cette fois, nous avons utilisé une autre version de la méthode add(). Cette méthode est surchargée. Cette version requiert 2 arguments. Le premier étant la position dans l' objet ArrayList. Le deuxième étant l' objet à mettre dans l' ArrayList. En ligne 10 : l' instruction dit que l' objet A doit être ajouté à l' ArrayList en position 0. D' après le dernier paragraphe des explications de l' exemple 1, il est inutile de préciser la position. Puisque forcément, c' est en position zéro que sera mis l' objet A. De même, pour la ligne 11, ajout de l' objet P en position 1, inutile aussi de préciser la position. Mais il fallait bien que je vous montre une autre version de la méthodeadd().

Attention ! ! ! ....
Si vous essayez de mettre un objet dans une position qui n' est pas la première inoccupée, vous n' aurez aucun message après compilation. Mais plutôt après exécution. La compilation affiche un message s' il y a erreur de syntaxe. A l' exécution, les messages sont plutôt de nature non-sens. Changez la ligne 10 en changeant par exemple 0 en 2. A l' exécution, le message d' erreur sera :
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
at java.util.ArrayList.add(ArrayList.java:368)
at MethodesArrayList2.main(Testeur.java:10)

Vous avez mis quelque chose en position 2 alors que la position 0 est encore vide. Avec la méthode add de la classe ArrayList dans le programme appelé MethodesArrayList2 et dans la méthode main() en ligne 10.

Si vous ne connaissez pas la première position inoccupée de l' objet sur lequel vous appliquez la méthode add() avec comme arguments la position et l' objet à ajouter, il vaut mieux utiliser la forme add() qui ne que prend qu' un seul argument : l' objet à ajouter.

Exemple 4 : 

1.    import java.util.ArrayList;
2.
3.    public class MethodesArrayList3
4.    {
5.        public static void main (String [] args )
6.        {
7.            ArrayList<Cercle> liste1 = new ArrayList<Cercle>();
8.            Cercle A = new Cercle(1, 2, 3);
9.            Points2 P = new Points2();
10.           liste1.add(A);
11.           liste1.add(P);
12.           System.out.println("Le nombre d' objets de liste1 = " + liste1.size() );
13.       }
14.   }

Après compilation, message d' erreur :

MethodesArrayList3.java:11: cannot find symbol
symbol : method add(Points2)
location: class java.util.ArrayList
liste1.add(P);

^

Le compilateur ne comprend pas l' instruction liste1.add(P)
La méthode add(P) est mal utilisée. En effet, j' ai instancié l' objet liste1 avec le constructeur ArrayList. Cela veut dire que j' ai typé les objets que doit contenir liste1. Ces objets sont de type Cercle. Et moi, en ligne 11 ( liste1.add(P);), j' essaye d' y mettre un objet de type P. Le compilateur refuse.

Exemple 5 : 

1.    import java.util.ArrayList;
2.
3.    public class MethodesArrayList4
4.    {
5.        public static void main (String [] args )
6.        {
7.            ArrayList<Cercle> liste1 = new ArrayList<Cercle>();
8.            Cercle A = new Cercle(1, 2, 3);
9.            Cercle B = new Cercle(2, 1, 4);
10.           liste1.add(A); liste1.add(B);
11.           ArrayList<Cercle> liste2 = new ArrayList<Cercle>();
12.           liste2.addAll(liste1);
13.           System.out.println("Le nombre d' objets de liste2 = " + liste2.size() );
14.       }
15.   }

Compilez puis exécutez ce programme. Il sera affiché :

Le nombre d' objets de liste2 = 2

Ligne 7 : je crée un objet ArrayList (liste1) de type Cercle. Lignes 8 et 9 : Je crée 2 objets de type Cercle. Ligne 10 : j' y mets les deux objets de type Cercle. Ligne 11 : je crée un autre objet ArrayList de type Cercle. Ligne 12 : J' utilise la méthode addAll() qui requiert comme argument, une collection. Ici, cette collection est un objet de type ArryList. Cette méthode met alors tous les objets de la collection argument (liste1) dans la collection sur laquelle on apllique la méthode (liste2). En ligne 13, je demande l' affichage du nombre d' objets contenus dans liste2. C' est forcément égal à 2. Puisque au départ, liste2 était vide. D' où l' affichage.

Une autre variante de la méthode addAll() permet de mettre tous les objets d' une collection à partir d' un indice. Premier argument, l' indice et deuxième argument, la collection. Exemple : liste2.addAll(2, liste1). Attention, si vous ne connaissez pas la première position inoccupée de liste2, utilisez plutôt la forme de la méthode addAll() qui ne prend qu' un seul argument : la collection.

Exemple 6 : 

1.    import java.util.ArrayList;
2.
3.    public class MethodesArrayList5
4.    {
5.        public static void main (String [] args )
6.        {
7.            ArrayList<Cercle> liste1 = new ArrayList<Cercle>();
8.            Cercle A = new Cercle(1, 2, 3);
9.            Cercle B = new Cercle(2, 1, 4);
10.           liste1.add(A);
11.           liste1.add(B);
12.           System.out.println("Le nombre d' objets de liste1 = " + liste1.size() );
13.           liste1.clear();
14.           System.out.println("Le nombre d' objets de liste1 = " + liste1.size() );
15.       }
16.   }

compilez puis exécutez. il sera affiché :

Le nombre d' objets de liste1 = 2
Le nombre d' objets de liste1 = 0
Vous l' avez compris, la méthode clear() permet de supprimer tous les objets contenus dans un objet ArrayList.

La méthode contains() est déclarée : public boolean contains(Object elem)
Elle requiert comme argument n' importe quel objet. Puis elle renvoie true si l' objet argument se trouve dans l' objet ArrayList sur lequel on applique la méthode. Par exemple dans l' exemple 6, si j' ajoute le code suivant : System.out.println(liste1.contains(A) );à l' affichage, j' aurais true. Parce qu' effectivement, l' objet A se trouve dans la collection liste1. Sinon, ce serait false.


La méthode indexOf() est déclarée : public int indexOf(Object elem)

Elle requiert comme argument n' importe quel objet. Puis elle renvoie une valeur de type int qui est la position où on trouve pour la première fois, l' objet argument dans l' objet ArrayList.


La méthode lastIndexOf() est déclarée : public int lastIndexOf(Object elem)

Elle requiert comme argument n' importe quel objet. Puis elle renvoie une valeur de type int qui est la position où on trouve pour la dernière fois, l' objet argument dans l' objet ArrayList.


La méthode isEmpty() est déclarée : public boolean isEmpty()

Elle ne requiert aucun argument. Elle renvoie true si l' objet ArrayList sur lequel on applique la méthode est vide. Autrement dit, elle permet de tester si aucun objet ne trouve dans l' ArrayList.


La méthode remove() est déclarée : public E remove(int index)

Elle requiert comme argument, un nombre entier qui est l' une des positions dans l' objet ArrayList. Puis elle renvoie l' objet situé à cette position. le E n' est pas un type. Mais il remplace le type correpondant à l' objet renvoyé. Si l' objet situé à la position index est de type Cercle, alors la méthode sera de type Cerlce. On pourra alors écrire Cercle C = liste1.remove(0).


Les autres méthodes de la classe ArrayList générique se trouvent sur la plate forme java :
Les autres méthodes de la classe ArrayList

La classe Stack<E> :

Elle permet de créer une collection d' objets du genre pile. Qu' est-ce qu' une pile d' objets ? ... Un ensemble d' objets les uns sur les autres. Comme une pile de carte. On met un premier objet, puis le deuxième sur le premier. Puis le troisième sur le second, ainsi de suite.
Si on veut enlever les objets. On les enlève un à un. En commençant par celui qui est au dessus. Autrement dit, le dernier objet mis dans la pile est le dernier à sortir. En anglais le sigle LiFo est utilisé pour caractérisé la collection Stack. LiFo = Last in, First out. Le dernier à entrer est le premier à sortir. Cette classe peut être intéressante dans la gestion de stocks dans une entreprise. Des stocks non périssables bien entendus.

Cette classe hérite des méthodes de la classe Vector. Nous verrons comment les objets d' une classe peuvent utiliser les méthodes d' une autre classe dans le chapitre héritage et polymorphisme. On peut donc appliquer les méthodes de la classes Vector à la classe Stack.

La classe Stack possède ses propres méthodes :

Un seul constructeur permettant de créer une collection Stack vide. Stack<Object> pile = new Stack<Object>();

La méthode empty() est déclarée : public boolean empty()

Elle ne requiert aucun argument. En l' appliquant à un objet Stack, elle renvoie true s' il n' y a aucun objet dans la collection Stack sur laquelle on applique la méthode. Sinon, elle renvoie false.


La méthode peek() est déclarée: public Object peek()

Elle renvoie l' objet qui se trouve au sommet de l' objet Stack. LiFo = Last in, First out. Mais cet objet retourné reste dans l' objet Stack. Attention ! L' objet retourné est du type Object. Si vous voulez mettre cet objet dans une variable. Assurez-vous de la compatibilité. Par exemple, si l' objet retourné est de type String, vous pouvez écrire : String chaine = pile.peek(); pile étant l' objet de type Stack dont on cherche à mettre l' objet au sommet dans la variable chaine. Si vous ne connaissez pas le type de l' objet contenu dans pile. Il vaut mieux écrire : Object o = pile.peek(). Puisque tous les objets appartiennnet à la classe Object(souvenez-vous). La conversion de l' objet renvoyé en un objet de type Object se fera implicitement. En général, le programmeur sait de quoi il s' agit.


La méthode pop() est déclarée : public Object pop()

Elle fait la même chose que peek(). Avec une différence, elle supprime l' objet au sommet dans la collection Stack


La méthode search() est déclarée : public int search(Object o)

Elle retourne l' indice de l' objet argument.

La méthode push() est déclarée : public Object push()

Les méthodes de la classe Vector qu' on peut utiliser avec les objets de typeStack sont : add, add, addAll, addAll, addElement, capacity, clear, clone, contains, containsAll, copyInto, elementAt, elements, ensureCapacity, equals, firstElement, get, hashCode, indexOf, indexOf, insertElementAt, isEmpty, lastElement, lastIndexOf, lastIndexOf, remove, remove, removeAll, removeAllElements, removeElement, removeElementAt, removeRange, retainAll, set, setElementAt, setSize, size, subList, toArray, toArray, toString, trimToSize

Vous pouvez les étudier en allant sur la plate forme java :
Méthodes Vector

La classe LinkedList<E> :

Je reviendrai sur cete classe pour vous en donner une idée générale.

C.5.2 Les classes HashTable, HashMap, WeakHashMap et TreeMap

Une map est une collection qui associe une clé à une valeur. La clé est unique, contrairement à la valeur qui peut être associée à plusieurs clés. La majorité des collections de type Map ont deux constructeurs : un constructeur sans paramètre créant une Map vide, et un constructeur prenant en paramètre une Map qui crée une nouvelle Map en fonction de la collection passée en paramètre.

Nous donnerons des exemples que pour la classe HashTable.
Pour les autres classes, ce sera une idée générale seulement. Vous ppourrez vous même regarder leurs méthodes sur la plateforme web de Java.
Il existe une autre classe dans le genre map. C' est la classe Dictionnary. Intéressante aussi.
Pour retrouver facilement une classe, vous devez taper dans le moteur de google :
java 5.0 class nomDeLaClasse (remaraquez l' absence de e dans class).

Exemple 7 : 

1.    import java.util.HashTable;
2.
3.    public class MethodesHashTable
4.    {
5.        public static void main (String [] args )
6.        {
7.       


Bientôt !

C.5.3 Les classes HashSet, LinkedHashSet et TreeSet

Une collection de type Set (autrement dit, un ensemble) n'accepte pas les doublons.

Nous ne donnerons des exemples que pour la classe HashSet.
Pour les autres classes, ce sera une idée générale seulement. Vous pourrez vous même regarder leurs méthodes sur la plateforme web de Java.
Pour retrouver facilement une classe, vous devez taper dans le moteur de google :
java 5.0 class nomDeLaClasse (remaraquez l' absence de e dans class).

Un bon programmeur doit pouvoir utiliser au maximum les méthodes prédéfinies. La connaissance de ces méthodes passe par la connaissance des classes dans lesquelles elles ont été définies. Ces classes se trouvent sur la plate forme web de java.
Chacun peut aller sur le web étudier ces méthodes. La difficulté, c' est de comprendre l' anglais. Donc, vous devez connaître l' anglais. Et dans le cas où c' est encore difficile, vous pouvez vous informer sur les forums de discussion. Vous n' avez pas besoin de mon site pour ça. Pour moi, vous faire connaître les classes avec leurs méthodes est un bonus. Mon but est d' apprendre aux débutants en programmation et/ou en java comment s' y prendre. Cela dit, lorsque j' aurais terminé le chapitre héritage et polymorphisme, je reviendrai sur ces classes. L' explication de certaines de ces classes passe par la connaissance de l' héritage.
Bon courage.

Débutants en Java -Débutants en P.O.O - Les bases de la P.O.O avec Java
Pub : www.vivrenfrance.com
Cours de java - java pour débutant - programmation java - cours de programmation java - débutant en programmation
.....