Sur cette page, nous répertorions quelques bibliothèques utiles d'usage général en langage Java. Celles-ci permettent d'apporter des fonctionnalités non-présentes ou incomplètes dans le JDK de la Standard ou Entreprise Edition. Généralement ces bibliothèques peuvent être utilisées avec le JDK ou Android.
Cette page est en travaux perpétuels.
Biliothèques de collections
Ces bibliothèques complètent ou remplacent l'API collections du JDK.
Apache Commons Collections
Il s'agit d'un projet Apache faisant partie de l'ensemble de biblithèques commons pour Java. Cette bibliothèque propose des interfaces supplémentaires avec l'implantation de nouvelles structures de données dont notamment :
- MultiMap<K,V> pour manipuler des maps pouvant accueillir plusieurs valeurs pour une même clé. Cela revient à utiliser une Map<K, Collection<V>> (avec plus de practicité d'utilisation).
- BidiMap<K,V> qui est une même bi-directionnelle, elle indexe donc aussi bien les clés que les valeurs. Les clés et les valeurs sont uniques et il y a une bijection entre les deux. Cette interface hérite de Map<K,V>.
- Bag<K> qui représente une structure de sac (clés associées à un nombre d'occurrences) ; on pourrait également manipuler (plus difficilement) un sac en utilisant le type Map<K, Integer>
- Trie<K,V> avec l'implantation PatriciaTrie<V> qui fournit un arbre lexicographique (les clés partageant un même préfixe partagent le même sous-arbre) avec des clés textuelles ; les opérations sur l'arbre ont une complexité linéaire en la taille de la clé.
Cette bibliothèque permet également de manipuler des comparateurs :
- en les chaînant (ComparatorChain<E>),
- en transformant des objets avant de les transmettre à un comparateur (TransformingComparator<I,O>),
- ...
Une partie de la bibliothèque permet de manipuler des itérateurs. On peut ainsi :
- chaîner des itérateurs les uns à la suite des autres (IteratorChain<E>),
- filtrer des éléments d'itérateurs (FilterIterator<E>),
- transformer un itérateur en Iterable ce qui est très pratique pour le parcourir avec une boucle for-each,
- créer un itérateur bouclant (qui revient au début après avoir atteint le dernier élément),
- créer un itérateur permettant de connaître le prochain élément sans le consommer (PeekingIterator<T>),
- obtenir un itérateur réalisant une permutation d'éléments d'un autre itérateur (PermutationIterator<E>),
- initialiser un itérateur transformant des éléments (TransformIterator<I,O>),
- fusionner plusieurs itérateurs sur des éléments triés en conservant l'ordre avec un tas (CollatingIterator<E>),
- fusionner plusieurs itérateurs en piochant tour à tour les éléments dans chaque itérateur (ZippingIterator<E>),
- ...
Javolution
Javolution propose un paquetage java.util avec de nouvelles classes pour les collections (FastCollection<E>, FastTable<E>, FastSet<E>, FastMap<K,V>...) héritant des interfaces de l'API standard. La philosophie de Javolution est de fournir des collections avec une complexité acceptable dans le pire des cas pour chaque opération plutôt que de se baser sur une complexité amortie. Cela est notamment intéressant pour des applications temps-réel.
Par exemple, FastTable<E> est une implantation de liste différente de ArrayList<E> : elle initialise différents petits tableaux (de 1024 éléments par défaut). Ainsi l'ajout d'un élément peut nécessiter tout au plus une recopie de l'index des tableaux ainsi que l'allocation d'un petit tableau ce qui peut être moins coûteux que la méthode traditionnelle d'ArrayList consistant à doubler la capacité en créan un nouveau tableau avec recopie.
Eclipse Collections (anciennement GS Collections)
Eclipse Collections est une bibliothèque Java qui propose des versions immutables et mutables de collections compatible avec l'API streams introduite par Java 8. Un type d'itérateur paresseux proche du comportement de streams est également proposé (API antérieure à l'API streams de Java 8).
La bibliothèque propose ses propres implantations de ArrayList (FastList), de HashSet et HashMap, de SortedSet et SortedMap. Des collections n'existant pas dans le JDK sont disponibles :
- BiMap pour une map bidirectionnelle (avec indexation des valeurs également pour l'obtention rapide d'une clé à partir d'une valeur) ; cela implique que non seulement les clés mais les valeurs aussi sont uniques
- Bag pour un sac associant à des clés un nombre d'exemplaires avec une version table de hachage (UnsortedBag) et une version arbre binaire de recherche (SortedMap)
- Multimap pour associer à chaque clé de la map différentes valeurs (équivalent à une structure Map<String, Collection<T>> du JDK).
Un des principaux intérêts d'Eclipse Collections est la présence de collections manipulant des types primitifs (int, long, float...). Avec le JDK, seuls des types réifiés peuvent être utilisés dans les collections ce qui occasionne une surconsommation mémoire importante (ainsi qu'un surcoût temporel lié aux problématiques d'allocation/désallocation mémoire).