« Que dirais-tu d'un petit entraînement pour ton cerveau ? J'espère qu'il est encore en état de marche. »

« Plus tôt, dans le tableau de conteneurs et de collections, tu as vu que la même interface pouvait avoir plusieurs implémentations. Je vais maintenant t'expliquer pourquoi nous avons besoin de cela. Et comment ArrayList diffère de LinkedList. »

« L'idée est que les collections peuvent être implémentées de différentes manières et qu'aucune implémentation n'est idéale dans tous les cas. Pour une approche donnée, certaines opérations sont rapides, mais d'autres plus lentes. Le contraire peut être vrai pour une autre approche. Il n'y a pas de solution universelle. »

« Voilà pourquoi la décision a été prise d'implémenter plusieurs versions de la même collection. Chaque implémentation doit être optimisée pour une série précise d'opérations. C'est comme ça que les différentes collections sont nées. Prenons deux classes à titre d'exemple : ArrayList et LinkedList. »

ArrayList vs. LinkedList - 1

« En interne, la classe ArrayList est implémentée comme un tableau ordinaire. C'est pourquoi l'insertion d'un élément au milieu exige que nous décalions d'abord tous les éléments qui suivent un par un, puis ajoutions le nouvel élément à l'emplacement libre. Obtenir et définir des éléments (get, set) est rapide, car ces opérations portent simplement sur l'élément de tableau pertinent. »

« LinkedList a une structure interne différente. Cette classe est implémentée sous forme de liste d'éléments interconnectés : un ensemble d'éléments distincts, dont chacun stocke des références aux éléments suivant et précédent dans la liste. Pour insérer un élément au milieu d'une telle liste, il te suffit de modifier les références de ses futurs voisins. Toutefois, pour obtenir l'élément n°130, tu dois parcourir chaque objet de 0 à 130. En d'autres termes, les opérations d'obtention et de définition seront lentes. Regarde le tableau suivant : »

Description Opération ArrayList LinkedList
Obtenir un élément get Rapide Lent
Définir un élément set Rapide Lent
Ajouter un élément (à la fin de la liste) add Rapide Rapide
Insérer un élément (à une position arbitraire) add(i, valeur) Lent Rapide
Supprimer un élément remove Lent Rapide

« Je vois. Je commence à comprendre, maintenant. Est-ce qu'il y a des critères ou règles qui m'aideraient à savoir quelle collection est la plus adaptée à une situation particulière ? »

« Pour faire simple, je vais te donner la règle suivante : si tu comptes insérer (ou supprimer) fréquemment des éléments au milieu de la collection, il est préférable d'utiliser une LinkedList. Dans tous les autres cas, ArrayList fonctionnera mieux. »

« Nous nous pencherons sur la façon dont ces listes sont structurées dans des leçons plus avancées, mais pour l'instant, nous allons simplement nous entraîner à les utiliser. »