Un objet Collection modélise tout groupe d'objets Java.
Collection est une interface générale qui définit les méthodes suivantes :

 public boolean add(Object o); 
 public boolean addAll(Collection<? extends Object> c); 
 public void clear(); 
 public boolean contains(Object o); 
 public boolean containsAll(Collection<?> c); 
 public boolean isEmpty(); 
 public Iterator<Object> iterator(); 
 public boolean remove(Object o); 
 public boolean removeAll(Collection<?> c); 
 public boolean retainAll(Collection<?> c); 
 public int size(); 
 public Object toArray(); 
 public <T> T toArray(T a); 

Code Java d'une implémentation de test de Collection.

Traverser une collection

  1. Classiquement, avec un Iterator, ce qui est la bonne et l'unique manière de faire si l'on veut
    1. filtrer ou retirer des éléments (méthode remove())
    2. Itérer sur des collections multiples en parallèle
  2. Plus élegamment avec la nouvelle boucle for de Java 5 (2005, plus si nouvelle en fait...) (cf Note du JCP à propos de cette nouvelle boucle)
    for (String myCollectionItem : myCollection) {
         System.out.println(myCollectionItem);
    }

Les sous interfaces de Collection (incluses dans le JDK, faîtes moi parvenir celles que vous avez écrites ;-) sont les suivantes :

Set

Groupe d'objet dans lequel les doublons ne sont pas admis...
Aucune méthode ajoutée dans cette interface (tout est hérité de Collection)

  • HashSet : implémentation reposant sur une hashtable, meilleure performance
    • accès en temps constant, indépendant donc du nombre d'éléments
    • "null" est permis
    • l'implémentation n'est PAS threadsafe. (Voir le wrapper adapté si besoin)
  • TreeSet : set ordonné d'éléments (parfois beaucoup plus pratique, donc beaucoup plus coûteux)
    • la relation d'ordre utilisée pour le tri est celle implémentée par la méthode equals() de l'objet contenu dans le TreeSet...Classique.
    • temps d'éxecution en log(n) pour les opérations de base add remove et contain.
    • l'implémentation n'est PAS threadsafe.
  • LinkedHashSet implémentation basée sur une linkedlist...
    • l'insertion d'un élément déja présent ne modifie pas son emplacement (au sens de l'itération sur le set)
    • l'implémentation n'est PAS threadsafe.

Sun API page for Set

List

Collection d'objets ordonnée, dans laquelle on navigue par index.
Implémentation concrètes du JDK :

  • Linkedlist (liste chaînée) :
    • non synchronisée
    • adaptée à certains besoins style "queues"
  • Arraylist
    • Implémentation se redimensionnant automatiquement (resizable capacity)
    • non synchronisée
  • Vector
    • similaire à Arraylist, mais synchronisé/threadsafe, donc plus coûteux.

Sun API page for List

Queue

  • nouvelle collection (Java 5, 2005...)

Sun API page for List

Map

Objet référençant des paires clés-valeurs. Evidemment, il n'est pas possible de dupliquer un clé.
A noter, la Map modélise l'abstraction mathématique connue sous le nom de fonction...Voila. :-)
Performance analogues aux hashsets...

  • HashMap<K, V>
  • LinkedHashMap<K, V>
  • TreeMap<K, V>
  • HashTable a été revue pour implémenter l'interface.

Sun API page for Map

Chacune des implémentation de List, Map et Set ont leurs avantages et leurs inconvénients, et c'est au développeur de choisir celle qui répond le mieux à ses besoins, dans un cadre de performance, optimisation de la consommation mémoire ou CPU...
Et les bon vieux tableaux? Non. Ils n'implémentent pas Collection. Il existe cependant une passerelle, la méthode toArray().