La classe Collections est une classe utilitaire pour les collections Java. Cette classe contient des méthodes statiques qui manipulent ou retournent des collections.

Toutes les méthodes de la classe Collections sont susceptibles de lever un exception NullPointerException si les collections passées en argument possèdent la valeur null.

Trois champs statiques et constants, sont contenus dans la classe Collections, pour représenter une collection vide immutable.

List liste = Collections.EMPTY_LIST;

Set ensemble = Collections.EMPTY_SET;

Set associations = Collections.EMPTY_MAP;

Les méthodes binarySearch() permettent de rechercher, selon un algorithme binaire, un objet spécifié au sein d'une collection de type List également donnée. Un comparateur peut également être fourni afin d'ordonner la liste conformément à ses propres règles. Par défaut, l'ordre naturel est employé pour ce tri. Par ailleurs, si la liste contient plusieurs éléments égaux, alors il n'y a aucune garantie sur lequel des éléments sera trouvé. La valeur de retour de ces méthodes est du type int. Si l'objet spécifié est trouvé, la méthode retournera la position de l'élément, dans le cas contraire, la valeur -1 sera renvoyée. Si les éléments de la liste ne sont pas mutuellement comparables, alors l'exception ClassCastException sera levée par les méthodes.

List liste = new LinkedList();
liste.add("Un élément");
// ...
liste.add("Dix éléments");
int res = Collections.binarySearch(liste, "Quatre éléments");

List liste = new ArrayList();
liste.add(new Video("Le jour le plus long", "Ken Annakin", 1962));
// ...
liste.add(new Video("Platoon", "Oliver Stone", 1986));
int res = Collections.binarySearch(liste, 
              new Video("Platoon", "Oliver Stone", 1986), 
              compAnnee);

La méthode reverseOrder() retourne un objet Comparator qui impose un tri inverse à celui de l'ordre naturel d'une collection.

List liste = new LinkedList();
liste.add("Un élément");
// ...
liste.add("Dix éléments");
int res = Collections.sort(liste, 
                              Collections.reverseOrder());

Le tri des collections List peut être mis en oeuvre par les méthodes sort(), selon l'ordre naturel de éléments de la collection ou par rapport à un comparateur spécifié.

ArrayList tableau = new ArrayList();
tableau.add(new Video("Platoon", "Oliver Stone", 1986));
// ...
tableau.add(new Video("Le jour le plus long", "Ken Annakin", 1962));
Collections.sort(tableau, compRealisateur);

Les méthodes min() et max() retournent respectivement l'élément minimum ou maximum d'une collection spécifiée, selon l'ordre naturel de ses éléments ou d'un comparateur fourni. Un objet de type Object est retourné par ces méthodes.

Object oMin = Collections.min(tableau);

Object oMin = Collections.min(tableau, compAnnee);

Object oMax = Collections.max(tableau);

Object oMax = Collections.max(tableau, compAnnee);

Plusieurs méthodes permettent de modifier l'ordre initiale d'une collection List. La méthode swap() est capable d'échanger la position d'éléments en indiquant leurs index.

Collections.swap(liste, 5, 8);

La méthode rotate() fait glisser dans un sens ou dans l'autre, l'élément pointé dans une sorte de cercle joignant les deux extrêmités de la liste.

List liste = new LinkedList();
for (int i = 0; i <= 10; i++)
  liste.add(new Integer(i));
Collections.rotate(liste, 1); // sens avant
// liste[10, 0, 1, ..., 9]
Collections.rotate(liste, -1); // sens arrière
// liste[1, 2, ..., 10, 0]

Les méthodes shuffle() permutent aléatoirement la liste spécifiée en utilisant un algorithme aléatiore par défaut ou précisé par un objet Random.

Collections.shuffle(liste);

Collections.shuffle(liste, objRandom);

L'inversion complète de l'ordre des éléments d'une liste peut être obtenu par la méthode reverse().

List liste = new LinkedList();
for (int i = 0; i <= 10; i++)
  liste.add(new Integer(i));
Collections.reverse(liste);
// liste[10, 9, ..., 0]

La méthode fill() remplace tous les éléments de la liste indiquée par l'objet passé en argument.

Collections.fill(liste, null);

Il est possible de rechercher une liste cible au sein d'une liste source par l'intermédiaire des méthodes indexOfSubList() et lastIndexOfSubList(). La position de la première occurrence ou de la dernière de la liste cible, à l'intérieur de la liste source, est retournée, sinon, -1 est renvoyée.

List listeSource = new LinkedList();
for (int i = 0; i <= 10; i++)
  listeSource.add(new Integer(i));
List listeCible = new LinkedList();
for (int i = 3; i <= 7; i++)
  listeCible.add(new Integer(i));
Collections.indexOfSubList(listeSource, listeCible);
// retourne 3
Collections.lastIndexOfSubList(listeSource, listeCible);
// retourne 7

La méthode de copie de liste copy() est également à disposition dans la classe Collections. Elle recopie tous les éléments d'une liste source vers une liste cible.

Collections.copy(listeSource, listeCible);

La méthode nCopies() a pour fonction de créer un liste qui sera composée d'un certain nombre d'occurrences de l'objet spécifié.

List liste = Collections.nCopies(100, "bonjour");

La méthode replaceAll() donne la possibilité de substituer un élément existant par un nouvel objet, au sein d'une liste.

boolean res = 
        Collections.replaceAll(liste, ancValeur, nouvValeur);

Une énumération sur une collection donnée, peut être récupérée par le truchement de la méthode enumeration().

Enumeration e = Collections.enumeration(collection);

La méthode list() retourne un objet Arraylist à partir d'une énumération passée en argument.

ArrayList tab = Collections.list(enumeration);

Les singletons, ou ensembles constitués d'un seul élément, sont réalisables pour chaque genre de collections Java, par le biais des méthodes singleton() (Set), singletonList() et singletonMap(). Chacune de ces méthodes prend en argument un élément pour les collections Set et List ou une entrée pour les Map.

Set ensemble = Collections.singleton(objet);

List liste =  Collections.singletonList(objet);

Map associations = Collections.singletonMap(cle, valeur);

La possibilité de fournir des collections non-modifiables, soit accessibles en lecture seule, est donnée par les méthodes particulières préfixées par unmodifiable.

Collection collection = 
        Collections.unmodifiableCollection(colSource);

List liste = Collections.unmodifiableList(listeSource);

Map associations = Collections.unmodifiableMap(mapSource).

Set ensemble = Collections.unmodifiableSet(ensSource);

SortedMap mapTrie = 
        Collections.unmodifiableSortedMap(sortedMapSource);

SortedSet setTrie = 
        Collections.unmodifiableSortedSet(sortedSetSource);

Afin de pallier à un défaut de synchronisation d'une collection lors d'un fonctionnement en multithreads, des méthodes spécialisées permettent de retourner une collection synchronisée. Les trois types de collections (Set, List et Map) sont prises en compte, ainsi que celles triées (SortedSet et SortedMap).

Collection colSync = 
        Collections.synchronizedCollection(colSource);

List listeSync = Collections.synchronizedList(listeSource);

Map assocSync = Collections.synchronizedMap(mapSource);

Set ensSync = Collections.synchronizedSet(setSource);

SortedMap sortedMapSync = 
        Collections.synchronizedSortedMap(sortedMapSource);

SortedSet sortedSetSync = 
        Collections.synchronizedSortedSet(sortedSetSource);

Les objets Arraylist, HashMap, HashSet, IdentityHashMap, LinkedHashMap, TreeMap, TreeSet et WeakHashMap ne sont pas synchronisés et nécessitent donc l'apport des méthodes précitées.

Seules les collections Hashtable et Vector supportent la synchronisation. Toutes les méthodes sensibles lors d'une utilisation en multithreads sont synchonisées dans ces classes.

// Extrait de la classe Vector
public synchronized void addElement(Object obj) {
  modCount++;
  ensureCapacityHelper(elementCount + 1);
  elementData[elementCount++] = obj;
}
// Extrait de la classe Hashtable
public synchronized Enumeration elements() {
  return getEnumeration(VALUES);
}