Un guide de la LinkedList Java

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 linkedList = new 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.