Pourquoi ArrayDeque est mieux que LinkedList

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

je vois à peine quelqu'un qui utilise ArrayDeque dans son code. Si quelqu'un donne plus de lumière sur la façon dont ArrayDeque est mis en œuvre, il serait utile.

si je le comprends, je serai plus sûr de l'utiliser. Je ne pouvais pas comprendre clairement la mise en œuvre de JDK quant à la façon dont il gère la tête et la queue de références.

98
demandé sur Jeremy S. 2011-05-28 21:16:39

7 réponses

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

Si vous avez besoin d'ajouter/supprimer des deux extrémités, ArrayDeque est nettement mieux qu'une liste liée. Accès aléatoire chaque élément est aussi O (1) pour une file d'attente cyclique.

le seul meilleur fonctionnement d'une liste liée est de supprimer l'élément courant pendant l'itération.

103
répondu bestsss 2011-05-28 17:23:34

je crois que le principal goulot d'étranglement de performance dans LinkedList est le fait que chaque fois que vous poussez à n'importe quelle extrémité de la deque, derrière la scène, l'implémentation alloue un nouveau noeud de liste lié, qui implique essentiellement JVM/OS, et c'est coûteux. En outre, chaque fois que vous sautez de n'importe quelle extrémité, les noeuds internes de LinkedList deviennent éligibles pour la collecte des ordures et c'est plus de travail derrière la scène. En outre, puisque les noeuds de liste liés sont alloués ici et là, l'utilisation de CPU le cache ne sera pas très utile.

Si cela peut intéresser, j'ai une preuve que l'ajout d'un élément ArrayList ou ArrayDeque s'exécute en temps constant amorti; reportez-vous à ce .

25
répondu coderodde 2018-04-27 11:27:48

ArrayDeque est nouveau avec Java 6, c'est pourquoi beaucoup de code (en particulier les projets qui essaient d'être compatibles avec les versions précédentes de Java) ne l'utilisent pas.

c'est "mieux" dans certains cas parce que vous n'attribuez pas un noeud pour chaque élément à insérer; à la place, tous les éléments sont stockés dans un tableau géant, qui est redimensionné s'il est plein.

21
répondu Chris Jester-Young 2011-05-28 17:18:29

tous les gens qui critiquent un LinkedList , pensez à tous les autres gars qui ont utilisé List en Java utilise probablement ArrayList et un LinkedList la plupart du temps parce qu'ils ont été avant Java 6 et parce que ce sont ceux qui sont enseignés comme un début dans la plupart des livres.

mais, cela ne veut pas dire, je prendrais aveuglément LinkedList 's ou ArrayDeque 's side. Si vous voulez savoir, jetez un oeil au-dessous de référence fait par Brian .

le montage d'essai prend en compte:

  • chaque objet d'essai est une chaîne de 500 caractères. Chaque chaîne est un objet différent dans la mémoire.
  • la taille du réseau d'essai variera pendant les essais.
  • pour chaque combinaison taille/file d'attente-implémentation, 100 tests sont exécutés et le temps moyen par test est calculé.
  • chacun des tests consiste à remplir chaque file d'attente avec tous les objets, puis de les retirer.
  • Mesurer le temps en millisecondes.

Résultat De L'Essai:

  • en dessous de 10 000 éléments, les deux tests LinkedList et ArrayDeque moyenne à un niveau inférieur à 1 ms.
  • comme les ensembles de données deviennent plus grands, les différences entre le Arraydequeque et LinkedList le temps de test moyen est plus long.
  • à la taille d'essai de 9 900 000 éléments, l'approche de la liste maillée a pris ~165% de plus que l'approche ArrayDeque.

graphe:

enter image description here

à emporter:

  • si votre besoin est de stocker 100 ou 200 éléments, il ne pas faire beaucoup de différence en utilisant l'une ou l'autre des files d'attente.
  • cependant, si vous développez sur mobile, vous pouvez utiliser un ArrayList ou ArrayDeque avec une bonne idée de la capacité maximale que la liste peut être nécessaire à cause d'une contrainte de mémoire stricte.
  • beaucoup de code existe, écrit en utilisant un LinkedList donc tread soigneusement lors de la décision d'utiliser un ArrayDeque surtout parce qu'il ne met pas en œuvre la List interface (je pense que la raison est assez grande). Il se peut que votre codebase parle beaucoup à L'interface List, très probablement et que vous décidiez de sauter avec un ArrayDeque . L'utiliser pour des implémentations internes pourrait être une bonne idée...
8
répondu pulp_fiction 2017-06-20 17:34:47

accéder à un élément dans Arraydequeque est toujours plus rapide comparé à LinkedList avec O(1) pour accéder aux éléments. Dans la liste liée, il faudra O (N) pour trouver le dernier élément.

ArrayDeque est efficace de mémoire puisque vous n'avez pas à garder la trace du prochain noeud contrairement à la liste liée.

même selon la documentation java, il a été cité que

ArrayDeque est Redimensionnable-tableau de mise en œuvre de la Deque interface. Les deques de tableau n'ont pas de restrictions de capacité; ils se développent comme nécessaire pour soutenir l'utilisation. Ils ne sont pas thread-safe; en l'absence de synchronisation externe, ils ne prennent pas en charge l'accès simultané par plusieurs threads. Les éléments Nuls sont interdits. Cette classe est susceptible d'être plus rapide que Stack lorsqu'elle est utilisée comme une pile, et plus rapide que LinkedList lorsqu'elle est utilisée comme file d'attente.

Benchmarking de ces deux prouve que ArrayDeque est plus rapide.

6
répondu Ravindra babu 2015-09-18 07:29:26

bien que ArrayDeque<E> et LinkedList<E> ont tous les deux mis en œuvre Deque<E> Interface, mais L'ArrayDeque utilise essentiellement objet array E[] pour garder les éléments à l'intérieur de son objet, de sorte qu'il utilise généralement l'index pour localiser la tête et la queue elements.

en un mot, il fonctionne juste comme Deque( avec toute la méthode de Deque), cependant utilise les données du tableau structure. En ce qui concerne celui qui est meilleur, dépend de comment et où vous les utilisez.

1
répondu rekinyz 2015-02-07 19:15:30

le Temps de la complexité pour ArrayDeque pour accéder à un élément de O(1) et que, pour LinkList est est O(N) pour l'accès au dernier élément. ArrayDeque n'est pas sûr de thread donc la synchronisation manuelle est nécessaire afin que vous puissiez y accéder à travers plusieurs threads et donc ils sont plus rapides.

-2
répondu Piyush Yawalkar 2015-09-21 07:02:09