Quelle est la manière la plus rapide de Java collection avec les fonctionnalités de base d'une File d'attente?
Quelle est la manière la plus rapide de la collection en Java?
Je n'ai besoin que les opérations d'ajouter et de supprimer, l'ordre n'est pas important, est égale à celle des éléments n'est pas un problème, rien de plus que d'ajouter et de supprimer est imporant.
Sans limite de taille est trop important.
Ces de collecte vous avez des Objets à l'intérieur de lui.
Actuellement, je suis en utilisant ArrayDeque parce que je vois c'est le plus rapide de la File d'attente de la mise en œuvre.
- Si l'ordre n'est pas important, vous n'êtes pas à la recherche d'une file d'attente.
- Actuellement, je suis en ajoutant dans la finale et la récupération depuis le début(comme une File d'attente) , mais si je peux prendre tous les éléments, un par un, je peux utiliser une autre Collection.
- "...l'optimisation prématurée est la racine de tous les maux"
- le choix de la collecte de droit n'est pas l'optimisation prématurée.
- C'est un webcrawler pour un deuxième projet, de sorte que la vitesse est un élément important ici.
- Si c'est un webcrawler il va être liées au réseau: les performances de la file d'attente va être infondée.
- Oui, je sais, mais c'est pour mieux garantir que la limite est le réseau et non à ma demande.
- BoltClock, c'est incorrect pour un capital-Q de la File d'attente en Java. Il signifie seulement "une mutable collection avec un élément de tête". Relire java.util.La file d'attente.
Vous devez vous connecter pour publier un commentaire.
ArrayDeque
est le meilleur. Voir cette référence, qui vient de ce blog sur les résultats de cette analyse comparative.ArrayDeque
n'ont pas les frais généraux de nœud allocationsLinkedList
n'est ni la surcharge de déplacer le contenu du tableau à gauche sur supprimerArrayList
a. Dans l'indice de référence, il effectue sur 3x ainsi queLinkedList
pour de grandes files d'attente et même un peu mieux que lesArrayList
pour les files d'attente vides. Pour de meilleures performances, vous aurez probablement envie de lui donner une capacité initiale assez grand pour contenir le nombre d'éléments qu'il est susceptible de détenir à la fois pour éviter de nombreux redimensionne.Entre
ArrayList
etLinkedList
, il semble que cela dépend de la moyenne de nombre de total des éléments de la file d'attente va contenir à un moment donné et queLinkedList
beatsArrayList
à partir de 10 éléments.ArrayList
serait à peu près équivalente, siArrayDeque
's javadoc suggère qu'il peut être un peu plus rapide. Et oui, étant donné les exigences de la question, pile-comme l'utilisation marcherait bien. L'indice de référence a été spécifiquement pour la file d'attente FIFO utilisation bien (vous pouvez voir un exemple de code dans les liens blog post).ArrayDeque
ne pas redimensionner car d'Une part, le dimensionner correctement est une option dans la vraie utilise et B) redimensionne sera extrêmement rare à long terme de l'utilisation d'une file d'attente. Microbenchmarks ne sera jamais parfait, mais je pense que l'on est assez bonne. Et oui, je n'ai misremember laArrayDeque
javadoc... oups!Vous pouvez utiliser un
java.util.LinkedList
- il est doublement lié et cicrular, afin d'ajouter à une extrémité, et tenant de l'autre sont en O(1)Quelle que soit mise en œuvre que vous choisissez, reportez-vous à la
Queue
interface, de sorte que vous pouvez facilement le modifier s'il s'avère ne pas l'adapter à votre cas (si, bien sûr, une file d'attente est ce qu'il vous faut en premier lieu)Mise à jour: Colin réponse montre un point de repère qui conclut que
ArrayDeque
est mieux. Les deux ont O(1) opérations, maisLinkedList
crée de nouveaux objets (les nœuds), ce qui légèrement les performances. Puisque les deux ont O(1) je ne pense pas que ce serait trop de mal à choisirLinkedList
bien.ArrayDeque
est objectivement meilleur.LinkedList
impacts à la fois le temps et les performances de la mémoire.LinkedList
's, de frais généraux supplémentaires de création de l'objet (en plus de la collecte des ordures de cet objet) affecte à chaque ajout/suppression de dans la file d'attente. Le test j'ai fait un lien se montre toujours 3x plus rapide qu'unLinkedList
.O(1) != O(1)
.O()
est juste une mesure de complexité, pas de temps d'exécution. Une opération qui prend toujours 5 ans, peu importe len
estO(1)
, comme c'est une opération qui prend toujours 5 mme. Je préfère utiliser celui qui prend 5 mme. Même une opération qui prend 5 ms par élément (qui estO(n)
) va être mieux que la 5 année, l'opération sin
ne soit pas trop grand.