1.3- Collections


1 Généralités sur les Collections

2 java.util.LinkedList

3 java.util.HashMap

4 Autres collections

5 Dépassez l'impossibilité d'objets de type primitif


1 Généralités sur les Collections

Certaines classes particulières procurent des collections d'objets et offrent un certain nombre de fonctionnalités qui permettent de gérer ces collections d'objets. Ces classes font partie du package java.util;. Les classes pour lesquelles on voudra utiliser les collections d'objets devront donc intégrer en première ligne, avec même la définition de classe :

import java.util;

public class ClassCourante{
...


Les collections proposées sont différentes des tableaux. Elles sont des ensembles de références d'objet de tailles non fixes. Il serait bien sûr possible de gérer des ensembles d'objets avec des tableaux, mais dans le cas d'un tableau, si on veut ajouter un 101ème élement à un tableau t de 100 élements, on doit créer un tableau t2 de 101 éléments, recopier l'ensemble des valeurs de t dans t2 et ajouter la nouvelle valeur. Soit :
void ajouterObjetTableau(Action[] t,Action a)
	{
	Action[] t2=new Action[t.length+1];
		for(int i=0;i<t.length;i++)
		t2[i]=t[i];
	t2[t2.length-1]=a;
	t=t2;
	}
Ce faisant, il faut un grand nombre d'opérations pour ajouter un élement à un tableau. Des structures de données de taille non fixe ont été introduites. En C ou en C++, on peut construire des structures de données très diverses à partir des pointeurs (liste chainées, pile, files etc), ceci est aussi possible en java, mais pour java, on utilise plus spontanément l'ensemble des collections d'objets pré-définies.

Quelques classes collections de java.util : LinkedList, HashMap, ArrayList, HashTable,... On en présente deux ici dans ce qui suit.


2 java.util.LinkedList

Une LinkedList est une collection d'objets. Une LinkedList enregistre une série d'adresses d'ojets, références. On précise le type des objets référencés lors de la création. Les éléments sont indiciés de 0 et n-1 avec n le nombre des élements. Soit la création d'une LinkedList d'objets de type Facture :

LinkedList factures=new LinkedList();
Cette déclaration est un peu particulière par rapport à ce qui précède dans le cours. Dans les versions antérieures à la version 1.5 du jdk, on pouvait déclarer :
LinkedList factures=new LinkedList();

Depuis la nouvelle version 1.5, il faut préciser le type des élements de la collection.
La classe LinkedList offre un certain nombre de méthodes :

Pour faire une boucle sur les objets d'une LinkedList :

/*On suppose disposer d'une Linkedlist liste d'objets de type MonType*/	
	for(int i=0;i<liste.size();i++)
	{
	Facture fact=factures.get(i);
	}


Il est bien sur possible de définir une collection de collection :
LinkedList> list=new LinkedList>();


3 java.util.HashMap

Une HashMap est une strcuture de données permettant d'enregistrer des objets en les réferençant / indexant par d'autre objets. Supposons par exemple que l'on crée une application qui gère les messages postés sur un forum. On dipose d'une classe Utilisateur et d'une classe Commentaire. On veut créer une strucuture de données qui enregistre pour un utilisateur donné la liste des messages qu'il poste. On peut utiliser la strcuture HashMap :

HashMap> forum=new HashMap>();
On enregistre des couples de réferences (clé, valeur). Par exemple des couples (Action,Cours) et à partir de l'objet Action, on recupere l'objet Cours associé. Les méthodes importantes de la classe HashMap :



4 Autres collections

Le package java.util contient d'autres structures de données qui ne sont pas décrites ici : ArrayList, TreeMap, Map...

5 Depasser l'impossibilité des collections de types primitifs

Les collections sont des ensembles de références, de variables objet. On pourrait vouloir manipuler des collections de variables de type primitifs. On ne peut pas le faire directement, on pourrait envisager de le faire très simplement en créant une classe :
public class VarInteger{

int valeur=0;

}
Ensuite, il suffit de manipuler une collection de type LinkedList. On peut créer de manière similaire des classes VarDouble, VarFloat etc...
De telles classes sont appellées des Wrappers. Il n'est pas nécessaire de définir de telles classes, elles sont déjà disponibles en java. Ainsi, on dispose notamment des classes :

Par exemple :
Integer val=Integer(7);
System.out.println(val.intValue());
Double valD=Double(0.5);
System.out.println(valD.doubleValue());