Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
AVANCEE
Spécialité : DSI
I. Introduction
Une collection est une structure de données dynamique qui permet de gérer n'importe quel
ensemble d'éléments de même type.
Tableaux : Collections :
- Non redimensionnables - Choix de l'implémentation (complexité)
- L'insertion nécessite un décalage et de l'interface
- Les indices doivent être des entiers - Structures dynamiques
- Légers en mémoire et accès en O(1) - Algorithmes communs
- Plus gourmandes en mémoire
Les classes et les interfaces de gestion de collections se situent dans le paquetage java.util.
Les collections implémentent toutes une interface. Celle-ci comprend un ensemble de
méthodes (dont certaines sont optionnelles) visant la gestion des collections. Il existe trois
grandes familles de collections, chacune définie par une interface de base :
• Les listes (interface List) sont des structures capables de contenir des objets de
différents types accessibles séquentiellement. Les objets de type List servent à stocker
des objets sans condition particulière sur la façon de les stocker. Ils acceptent toutes les
valeurs, même les valeurs null
• Les ensembles (interface Set) sont des structures contenant des éléments non dupliqués
dont l'accès reste très performant. Les objets de types Set sont donc un peu plus
restrictifs (pas de doublons) ce qui est pratique pour une liste d'éléments uniques, par
exemple.
• Les tableaux associatifs (interface Map) sont des structures qui permettent de lier un
objet clé à un autre objet valeur. Elles fonctionnent avec un système « clé - valeur »
pour ranger et retrouver les objets qu'elles contiennent
1
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
2
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
System.out.println(maListe.get(0));
System.out.println(maListe.get(1));
System.out.println(maListe.get(2));
}
• Vector (Tableau redimensionnable) Cette classe a été créée avant la classe ArrayList.
C’est un tableau dont la taille croit lorsque des éléments sont ajoutés.
NB : Cette classe est "thread-safe", c'est-à-dire que plusieurs processus peuvent
l'utiliser en même temps sans risque.
• LinkedList (Listes chaînées) Cette classe implémente l'interface List en chaînant les
éléments (liste doublement chaînée). C’est une liste dont chaque élément est lié aux
éléments adjacents par une référence à ces derniers. Chaque élément contient une
référence à l'élément précédent et à l'élément suivant, excepté le premier, dont
l'élément précédent vaut null, et le dernier, dont l'élément suivant vaut également null.
La figure suivante représente un schéma qui permet de mieux comprendre le
fonctionnement de cet objet :
3
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
Exemple :
Remarque importante:
LinkedList VS ArrayList/Vector:
Contrairement aux LinkedList, les ArrayList/ Vector sont rapides en lecture, même avec un
gros volume d'objets. Elles sont cependant plus lentes si vous devez ajouter ou supprimer des
données en milieu de liste. Pour résumer, si vous effectuez beaucoup de lectures sans vous
soucier de l'ordre des éléments, optez pour une ArrayList ou un Vector ; en revanche, si vous
insérez beaucoup de données au milieu de la liste, optez pour une Linkedlist.
4
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
• LinkedHashSet : diffère de HashSet car elle maintient une liste doublement liée à travers
toutes ses entrées, permettant de retrouver l'ordre d'insertion.
• TreeSet : Les ensembles triés sont identiques aux ensembles simples excepté qu'ils
peuvent être triés par défaut à leur création. Cette classe implémente l’interface SortedSet
et utilise un arbre de recherche. Pour pouvoir utiliser un TreeSet, il faut que les éléments
soit comparables.
Remarque : Les Set sont particulièrement adaptés pour manipuler une grande quantité de
données. Cependant, les performances de ceux-ci peuvent être amoindries en insertion.
Généralement, on opte pour une HashSet, car il est plus performant en temps d'accès, mais si
vous avez besoin que votre collection soit constamment triée, optez pour un TreeSet.
Depuis la version 5, nous pouvons préciser le type des éléments contenus dans la collection
(si tous les éléments sont de même type) en écrivant :
LinkedList<Integer> maListe = new LinkedList<Integer>();
Remarque : les Maps n'implémentant pas l'interface Iterable, ils ne permettent pas d'être
parcourus à l'aide d'un itérateur
• La boucle FOR-EACH : La version 5 de Java introduit une nouvelle boucle qui
simplifie le parcours d’une collection : la boucle for-each.
Par exemple, le parcours d'une liste d’entiers, nommée maListe peut se faire de la
manière suivante
Cette boucle est d’un usage très intuitif. Cependant, on remarquera qu’il n’est pas possible de
supprimer des éléments de la collection si on la parcoure avec un for-each.
5
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
Il est possible de parcourir une collection de type liste, de la même façon (ou presque) qu’on
parcoure un tableau. Par exemple, le parcours d'une liste d’entiers, nommée maListe peut se
faire de la manière suivante :
Exemple complet :
}
}
6
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
de retrouver rapidement la valeur qui lui a été associée. Les clés sont des objets uniques
pouvant être NULL; Les valeurs peuvent être multiples et NULL.
On retrouve principalement quatre classes qui implémentent l'interface Map : HashTable,
HashMap, LinkedHashMap et TreeMap.
7
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
Exemple :
map.put(1, "Bonjour");
map.put(2, "Bonsoir");
map.put(3, "Bonne journée");
// Parcours de valeurs
for (Iterator<String> i = map.values().iterator() ; i.hasNext() ;)
System.out.println(i.next());
// Parcours de clefs
for (Iterator<Integer> i = map.keySet().iterator() ; i.hasNext() ; )
System.out.println(i.next());
}
}
8
POO Avancée : PROGRAMMATION OBJET
AVANCEE
Spécialité : DSI
Les objets Maps ont comme point faible majeur : leur rapport conflictuel avec la taille des
données à stocker. En effet, plus vous aurez de valeurs à mettre dans un objet Map, plus
celles-ci seront lentes et lourdes : logique, puisque par rapport aux autres collections, il stocke
une donnée supplémentaire par enregistrement.
Résumé et comparatif :
ArrayList Vector LinkedList HashSet LinkedHashSet TreeSet Hashtable LinkedHashMap HashMap TreeMap
Null √ √ √ √ √ X X √ √ √
Duplicate √ √ √ X X X X X X X
Sorted
Result
X X X X X √ X X X √
Retrieval
order
same as √ √ √ X √ X X √ X X
insertion