Un guide de la LinkedList Java
1. introduction
LinkedList est une implémentation de liste à double lien des interfacesList etDeque. Il implémente toutes les opérations de liste optionnelles et autorise tous les éléments (y comprisnull).
2. Caractéristiques
Vous trouverez ci-dessous les propriétés les plus importantes desLinkedList:
-
Les opérations qui indexent dans la liste traverseront la liste depuis le début ou la fin, selon ce qui est le plus proche de l'index spécifié
-
Ce n'est passynchronized
-
Ses itérateursIterator etListIterator sontfail-fast (ce qui signifie qu’après la création de l’itérateur, si la liste est modifiée, unConcurrentModificationException sera lancé)
-
Chaque élément est un nœud, qui garde une référence aux suivants et aux précédents
-
Il maintient l'ordre d'insertion
Bien queLinkedList ne soit pas synchronisé, nous pouvons en récupérer une version synchronisée en appelant la méthodeCollections.synchronizedList, comme:
List list = Collections.synchronizedList(new LinkedList(...));
3. Comparaison avecArrayList
Bien que les deux implémentent l'interfaceList, ils ont une sémantique différente - ce qui affectera certainement la décision d'utiliser.
3.1. Structure
UnArrayList est une structure de données basée sur un index soutenue par unArray. Il fournit un accès aléatoire à ses éléments avec une performance égale à O (1).
D'autre part, unLinkedList stocke ses données sous forme de liste d'éléments et chaque élément est lié à son élément précédent et suivant. Dans ce cas, la recherche d'un élément a un temps d'exécution égal à O (n).
3.2. Les opérations
Les opérations d'insertion, d'ajout et de suppression d'un élément sont plus rapides dans unLinkedList car il n'est pas nécessaire de redimensionner un tableau ou de mettre à jour l'index lorsqu'un élément est ajouté à une position arbitraire dans la collection, uniquement des références dans les éléments environnants changera.
3.3. Utilisation de la mémoire
UnLinkedList consomme plus de mémoire qu'unArrayList car chaque nœud d'unLinkedList stocke deux références, une pour son élément précédent et une pour son élément suivant, alors queArrayList tient seulement les données et leur index.
4. Usage
Voici quelques exemples de code qui montrent comment utiliserLinkedList:
4.1. Création
LinkedList
4.2. Ajout d'un élément
LinkedList implémente les interfacesList etDeque, en plus des méthodes standardadd() etaddAll(), vous pouvez trouveraddFirst() etaddLast(), ce qui ajoute un élément au début ou à la fin, respectivement.
4.3. Suppression d'un élément
Comme pour l'ajout d'éléments, cette implémentation de liste offreremoveFirst() etremoveLast().
En outre, il existe des méthodes pratiquesremoveFirstOccurence() etremoveLastOccurence() qui retournent booléen (vrai si la collection contient l'élément spécifié).
4.4. Opérations de file d'attente
L'interface deDeque fournit des comportements de type file d'attente (en fait,Deque étend l'interface deQueue):
linkedList.poll();
linkedList.pop();
Ces méthodes récupèrent le premier élément et le suppriment de la liste.
La différence entrepoll() etpop() est quepop lanceraNoSuchElementException() sur une liste vide, alors quepoll renvoie null. Les APIpollFirst() etpollLast() sont également disponibles.
Voici par exemple comment fonctionne l'APIpush:
linkedList.push(Object o);
Qui insère l'élément en tant que tête de la collection.
LinkedList a de nombreuses autres méthodes, dont la plupart devraient être familières à un utilisateur qui a déjà utiliséLists. D'autres qui sont fournis parDeque peuvent être une alternative pratique aux méthodes «standard».
La documentation complète peut être trouvéehere.
5. Conclusion
ArrayList est généralement l'implémentation par défaut deList.
Cependant, il existe certains cas d'utilisation où l'utilisation deLinkedList conviendra mieux, comme les préférences pour un temps d'insertion / suppression constant (par exemple, des insertions / suppressions / mises à jour fréquentes), sur un temps d'accès constant et une utilisation efficace de la mémoire.
Des exemples de code peuvent être trouvésover on GitHub.