214 votes

Pourquoi ArrayDeque est-il meilleur que LinkedList ?

J'essaie de comprendre pourquoi le ArrayDeque de Java est meilleur que le LinkedList de Java car ils implémentent tous deux l'interface Deque.

Je vois rarement quelqu'un utiliser ArrayDeque dans son code. Si quelqu'un m'éclaire sur la façon dont ArrayDeque est implémenté, ce serait utile.

Si je le comprends, je serai plus confiant en l'utilisant. Je n'ai pas pu comprendre clairement l'implémentation du JDK quant à la manière dont il gère les références tête et queue.

5 votes

Regardez la réponse à cette question que j'ai posée il y a quelques jours : stackoverflow.com/questions/6129805/

1 votes

Dans le dossier, où vous avez installé votre jdk, il y a un fichier src.zip . Il s'agit d'une archive contenant le code source des classes java. Je recommande fortement d'étudier la structure et les internes de ces classes pour mieux comprendre le fonctionnement des classes java.

0 votes

Encore un point. La taille par défaut de ArrayDeque est de 16. ArrayDeque double sa taille lorsqu'il est plein. Les éléments sont copiés dans le nouveau tableau après que la taille ait doublé. Il est préférable d'initialiser ArrayDeque avec une taille initiale.

201voto

bestsss Points 6403

Les structures liées sont probablement la pire structure à itérer avec un manque de cache sur chaque élément. En plus de cela, elles consomment beaucoup plus de mémoire.

Si vous avez besoin d'ajouter/supprimer les deux extrémités, ArrayDeque est nettement meilleur qu'une liste chaînée. L'accès aléatoire à chaque élément est également O(1) pour une file cyclique.

La seule meilleure opération d'une liste chaînée est la suppression de l'élément courant pendant l'itération.

86 votes

Une autre différence à prendre en compte : LinkedList supporte les éléments nuls, alors que ArrayDeque ne le fait pas.

26 votes

Un autre petit inconvénient (pour les applications en temps réel) est que lors d'une opération de push/add, il faut un peu plus de temps lorsque le tableau interne du ArrayDeque est plein, car il doit doubler sa taille et copier toutes les données.

7 votes

@AndreiI, ce n'est qu'un côté de l'histoire. Même si vous excluez les coûts d'itération pour les applications en temps réel et la possibilité de préallouer la capacité nécessaire, le GC peut avoir besoin d'itérer l'ensemble de la LinkedList. En fait, vous déplacez les coûts (qui sont plus élevés) vers le GC.

92voto

coderodde Points 530

Je pense que le principal goulot d'étranglement en matière de performances dans le domaine des LinkedList est le fait qu'à chaque fois que vous poussez vers une extrémité de la deque, l'implémentation alloue en arrière-plan un nouveau nœud de liste liée, ce qui implique essentiellement la JVM/OS, et c'est coûteux. De plus, à chaque fois que l'on "pop" à partir d'une extrémité, les noeuds internes de la liste liée de LinkedList deviennent éligibles pour la collecte des déchets et cela représente plus de travail derrière la scène. De plus, comme les nœuds de la liste chaînée sont alloués ici et là, l'utilisation du cache du CPU n'apportera pas beaucoup d'avantages.

Si cela peut vous intéresser, j'ai prouvé que l'ajout (l'ajout) d'un élément à la liste des éléments de la liste des éléments de la liste des éléments de la liste des éléments. ArrayList o ArrayDeque s'exécute en temps constant amorti ; voir este .

29voto

Chris Jester-Young Points 102876

ArrayDeque est une nouveauté de Java 6, ce qui explique pourquoi de nombreux codes (notamment les projets qui tentent d'être compatibles avec des versions antérieures de Java) ne l'utilisent pas.

C'est "mieux" dans certains cas parce que vous n'allouez pas un nœud pour chaque élément à insérer ; au lieu de cela, tous les éléments sont stockés dans un tableau géant, qui est redimensionné s'il est plein.

22voto

Ravindra babu Points 5571

ArrayDeque y LinkedList mettent en œuvre Deque mais la mise en œuvre est différente.

Principales différences :

  1. Le site ArrayDeque est l'implémentation du tableau redimensionnable de la classe Deque et l'interface LinkedList est l'implémentation de la liste

  2. Des éléments NULL peuvent être ajoutés à LinkedList mais pas dans ArrayDeque

  3. ArrayDeque est plus efficace que le LinkedList pour l'opération d'ajout et de suppression aux deux extrémités et la mise en œuvre de LinkedList est efficace pour supprimer l'élément courant pendant l'itération.

  4. Le site LinkedList consomme plus de mémoire que l'implémentation ArrayDeque

Donc, si vous ne devez pas prendre en charge les éléments NULL && vous cherchez à réduire la mémoire && l'efficacité de l'ajout/suppression d'éléments aux deux extrémités, ArrayDeque est le meilleur

Se référer à documentation pour plus de détails.

1voto

user1146450 Points 2429

Bien que ArrayDeque<E> y LinkedList<E> ont tous deux mis en œuvre Deque<E> mais ArrayDeque utilise fondamentalement un tableau d'objets. E[] pour conserver les éléments à l'intérieur de son objet, il utilise donc généralement l'index pour localiser les éléments de tête et de queue.

En un mot, il fonctionne comme Deque (avec toutes les méthodes de Deque), mais utilise la structure de données des tableaux. Pour ce qui est de savoir lequel est le meilleur, cela dépend de comment et où vous les utilisez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X