Pourquoi est-ArrayDeque mieux que LinkedList
J'essaie de comprendre pourquoi Java est ArrayDeque est mieux que Java est LinkedList qu'ils mettent en œuvre Deque interface.
J'ai du mal à voir quelqu'un à l'aide de ArrayDeque dans leur code. Si quelqu'un jette plus de lumière dans la façon dont ArrayDeque est mis en œuvre, il serait utile.
Si je comprends bien, je vais être plus confiant en l'utilisant. Je ne pouvais pas comprendre clairement le JDK de mise en œuvre de la façon dont il gère la tête et la queue références.
- Regardez la réponse à cette question, je l'ai fait il y a de jours: stackoverflow.com/questions/6129805/...
- Dans le dossier où vous avez votre jdk est installé, il y a un fichier
src.zip
. C'est l'archive avec le code source des classes java. Je recommande fortement à l'étude de ces classes de la structure et du fonctionnement interne de mieux comprendre comment des classes java de travail.
Vous devez vous connecter pour publier un commentaire.
Structures sont peut-être le pire de la structure de l'itération avec un cache miss sur chaque élément. Sur le dessus de ce qu'ils consomment de manière plus 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 reprise cyclique de la file d'attente.
La seule mieux le fonctionnement d'une liste chaînée est la suppression de l'élément courant au cours d'une itération.
LinkedList
implémenteList
toutArrayDeque
ne l'est pas. Cela signifie queLinkedList
ont des méthodes commeindexOf
ouremove(int)
toutArrayDeque
n'a pas. Il peut être important parfois.Je crois que le principal goulot d'étranglement des performances dans
LinkedList
est le fait que chaque fois que vous poussez à la toute fin de la deque, derrière la scène de la mise en œuvre alloue une nouvelle liste liée nœud, ce qui implique essentiellement JVM/OS, et c'est cher. Aussi, chaque fois que vous la pop à partir de la toute fin, les noeuds internes deLinkedList
devenir admissibles pour la collecte des ordures et c'est plus de travail derrière la scène.Aussi, depuis la liste des nœuds sont répartis ici et là, l'utilisation du cache du PROCESSEUR ne sera pas de fournir beaucoup d'avantages.
Si cela peut intéresser, j'ai une preuve que l'ajout d'un élément à
ArrayList
ouArrayDeque
s'exécute en temps constant amorti; reportez-vous à cette.ArrayDeque
est une nouveauté de la version 6 de Java, qui est pourquoi beaucoup de code (en particulier les projets qui s'efforcent d'être compatible avec les anciennes versions de Java) ne l'utilisez pas.C'est "mieux" dans certains cas, parce que vous n'êtes pas à l'attribution d'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ée si elle est pleine.
Toutes les personnes critiquant un
LinkedList
, pensez à tous les autres gars qui a été à l'aide deList
en Java utilise probablementArrayList
et unLinkedList
la plupart du temps parce qu'ils ont été avant de Java 6 et parce que ce sont celles qui sont enseignées comme un début dans la plupart des livres.Mais, cela ne signifie pas, je aveuglément prendre
LinkedList
's ouArrayDeque
s'à côté. Si vous voulez savoir, jetez un oeil au-dessous de référence réalisé par Brian.La configuration de test à l'estime:
Résultat Du Test:
Graphique:
À emporter:
beaucoup de différence à l'aide de l'une des Files d'attente.
ArrayList
ouArrayDeque
avec une bonne estimation de leur capacité maximaleque la liste peut être nécessaire pour être en raison de la stricte contrainte de mémoire.
LinkedList
donc faire preuve de prudence lorsque vous décidez d'utiliser unArrayDeque
surtout parce qu'il NE PAS mettre en œuvre laList
interface(je pense que c'est une raison assez grand). Il se peut que votre base de code parle à la Liste de l'interface largement, plus probablement et vous décider à sauter à unArrayDeque
. De l'utiliser pour les implémentations internes pourrait être une bonne idée...Accéder à un élément dans ArrayDeque est toujours plus rapide par rapport à LinkedList avec O(1) pour accéder à des éléments. Dans la liste chaînée, il faudra du temps O(N) pour trouver le dernier élément.
ArrayDeque de la mémoire est efficace puisque vous n'avez pas à garder une trace de la prochaine nœud contrairement à la Liste Liée.
Même que par la documentation java, il a été cité que
L'analyse comparative de ces deux prouve que ArrayDeque est plus rapide.
header.previous.element
). La "mémoire de l'efficacité" peut également être remis en question depuis la sauvegarde de la matrice est toujours redimensionnée à la puissance de 2.bien que
ArrayDeque<E>
etLinkedList<E>
ont à la fois mis en œuvreDeque<E>
de l'Interface, mais le ArrayDeque utilise fondamentalement tableau d'ObjetsE[]
pour garder les éléments à l'intérieur de son Objet, de sorte qu'il utilise généralement des index pour localiser la tête et la queue éléments.En un mot, il fonctionne exactement comme Deque (avec tous les Deque de la méthode), mais utilise la matrice de structure de données. En ce qui concerne qui est mieux, dépend de la manière dont vous les utilisez.
Temps de 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 thread-safe manuellement la synchronisation est nécessaire de sorte que vous pouvez y accéder par plusieurs threads et donc ils sont plus rapides.
LinkedList
en JavaCollection
, il est doublement lié et accès rapide à la tête et la queue, de sorte que l'accès au dernier élément prend également en O(1).