Java collections de maintien de l'ordre d'insertion
Pourquoi certains de la collection de structures de données pas de maintenir l'ordre d'insertion? Quelle est la particularité de la progression par rapport au maintien de l'ordre d'insertion?
Avons-nous à gagner quelque chose si nous ne maintenons pas l'ordre?
- Par exemple, Pourquoi un
java.util.HashSet
nécessité de maintenir l'ordre de l'insertion? - non .. je me demande ..ne nous lâche rien tant que le maintien de l'ordre ..contrairement avons-nous à gagner quelque chose si l'on ne maintient pas l'ordre
- par exemple:LinkedList. Pensez-y, ne serait-il pas plus facile à ajouter/ajouter à une liste liée de l'insérer dans le milieu?
Vous devez vous connecter pour publier un commentaire.
Performance. Si vous voulez l'original de l'ordre d'insertion, il y a les LinkedXXX classes, et qui maintiennent un des liste dans l'ordre d'insertion. La plupart du temps vous ne vous inquiétez pas, si vous utilisez un HashXXX, ou si vous voulez un ordre naturel, de sorte que vous utilisez TreeXXX. Dans chacun de ces cas, pourquoi devriez-vous payer le coût supplémentaire de la liste chaînée?
ArrayList
ajustement de la réponse?Les collections de ne pas maintenir l'ordre d'insertion. Certains juste valeur par défaut pour ajouter une nouvelle valeur à la fin. Le maintien de l'ordre d'insertion n'est utile que si l'ordre de priorité des objets par la ou les utiliser pour trier les objets d'une certaine façon.
Que pourquoi certaines collections de la maintenir par défaut et d'autres ne le font pas, c'est principalement causée par la mise en œuvre et parfois seulement une partie des collections de la définition.
Listes maintenir l'ordre d'insertion que d'ajouter une nouvelle entrée à la fin ou le début est le plus rapide de la mise en œuvre du complément(d'Objet ) de la méthode.
Jeux de Le HashSet et TreeSet implémentations de ne pas maintenir l'ordre d'insertion comme les objets sont triés pour la recherche rapide et le maintien de l'ordre d'insertion aurait besoin de mémoire supplémentaire. Il en résulte un gain de performance depuis la commande d'insertion est presque jamais intéressant pour les Ensembles.
ArrayDeque un deque peut être utilisé pour de simples québec et de la pile si vous voulez avoir un "first in first out" ou "first in last out" de son comportement, exiger que la ArrayDeque maintient l'ordre d'insertion. Dans ce cas, l'ordre d'insertion est maintenu en tant que partie centrale de la classes de contrat.
LinkedHashMap
), mais qui prend plus de code, et à l'exécution, plus de mémoire et plus de temps. La perte de performance est généralement pas significatif, mais il peut l'être.TreeSet/Map
, la raison principale de les utiliser est le naturel de l'itération de l'ordre et d'autres fonctionnalités ont été ajoutées dans laSortedSet/Map
interface.Map
implémentations ne sont pasCollection
s car ils ne mettent pas en œuvre laCollection
interface. Ils ont des méthodes similaires, mais c'est tout. Vérifier: download.oracle.com/javase/1.4.2/docs/guide/collections/... (#Interfaces de Collection) les Plus susceptibles de l'OP question les adresses des cartes trop bien.Dépend de ce que vous avez besoin de la mise en œuvre de bien faire. Ordre d'Insertion n'est généralement pas intéressant donc il n'est pas nécessaire de le maintenir de sorte que vous pouvez réorganiser pour obtenir de meilleures performances.
Pour les Cartes, il est généralement HashMap et Arborescences qui est utilisé. En utilisant des codes de hachage, les entrées peuvent être mis dans de petits groupes de recherche facile dans. Le TreeMap maintient un ordre de tri de l'insertion des entrées au prix d'un ralentissement de la recherche, mais plus facile à résoudre que d'une table de hachage.
Lorsque vous utilisez un HashSet (ou une table de hachage), les données sont stockées dans des "compartiments" basé sur le hachage de l'objet. De cette façon, vos données est plus facile d'accès parce que vous n'avez pas à chercher pour ce type particulier de données dans l'ensemble, vous avez juste à regarder dans la bonne seau.
De cette façon, vous pouvez augmenter les performances sur des points précis.
Chaque Collection de la mise en œuvre de ses particularité de faire mieux pour une utilisation dans une certaine condition. Chacune de ces particularités ont un coût. Donc, si vous n'avez pas vraiment besoin (par exemple l'ordre d'insertion) vous feriez mieux d'utiliser une mise en œuvre qui ne le proposent pas et s'intègre mieux à vos exigences.
Pourquoi est-il nécessaire pour maintenir l'ordre de l'insertion? Si vous utilisez
HashMap
, vous pouvez obtenir de l'entrée enkey
. Cela ne signifie pas qu'il ne fournit pas de classes que de faire ce que vous voulez.Il y a une section dans le O'Reilly Java livre de cuisine appelé à "Éviter l'envie de tri" La question que vous devriez poser est en fait le contraire de votre question initiale ... "avons-nous à gagner quelque chose par le tri?" Il faudra beaucoup d'effort de trier et de maintenir l'ordre. Assurez-vous que le tri est facile, mais il n'a généralement pas d'échelle dans la plupart des programmes. Si vous allez à la manipulation des milliers ou des dizaines de milliers de demandes (insrt,del,get,etc.) par seconde si vous êtes à l'aide d'un triées ou non triés structure de données est sérieusement d'aller à la matière.
certains de la Collection ne sont pas à maintenir l'ordre en raison de, ils calculent le hashCode de contenu et de le stocker en conséquence dans le seau.
Je ne peux pas citer une référence, mais par la conception de la
List
etSet
les implémentations de laCollection
interface sont essentiellement extensibleArray
s. CommeCollections
par défaut offrir des méthodes pour dynamiquement ajouter et supprimer éléments à tout moment -- quiArray
s ne-ordre d'insertion peut ne pas être préservée.Ainsi, comme il existe plusieurs méthodes pour la manipulation du contenu, il y a un besoin pour des implémentations qui ne maintenir l'ordre.
Un autre point est la performance, comme le plus performant
Collection
peut-être pas que, ce qui préserve leur ordre d'insertion. Je suis toutefois pas sûr, comment exactementCollections
gérer leur contenu pour améliorer les performances.Donc, en bref, les deux principales raisons je pense, pourquoi il y a de l'ordre de la préservation de
Collection
implémentations sont:Arrays
est une classe réelle, tandis que les tableaux sont un type spécial de conteneur d'objets. Je suis aussi assez sûrLinkedList
en fait utiliser une liste chaînée, mais je n'ai pas lu le code. 🙂LinkedList
commentaire: où est la contradiction de ce que j'ai posté?LinkedList
autant que je sache est unList
(lire extensibleArray
) dont l'ordre d'insertion est maintenu dans un autreList
(les deux sont lié, d'où le nom). Ou, suis-je tort de celui-ci?Array
objet ne propose pas de méthodes dynamiquement supprimer et ajouter des éléments. C'est pourquoiList
existe, en premier lieu. Mon deuxième paragraphe dit ce que vous dites dans votre post. Ne pas la flamme de suite sur votre première impression, mon pote.Ok ... donc, ces postes sont de vieux par rapport à maintenant, mais l'ordre d'insertion est nécessaire en fonction de vos besoins ou des exigences de l'application, il suffit donc d'utiliser le bon type de collecte. Pour la plupart partie, il n'est pas nécessaire, mais dans une situation où vous avez besoin d'utiliser des objets dans l'ordre où ils ont été stockés, je vois un réel besoin. Je pense que l'ordre des questions lorsque vous créez par exemple un assistant ou d'un moteur de flux ou quelque chose de cette nature là où vous devez aller d'un état à état ou de quelque chose. En ce sens, vous pouvez lire des trucs à partir de la liste sans avoir à garder une trace de ce que vous avez besoin de la prochaine ou parcourir la liste pour trouver ce que vous voulez. Il aide à la performance dans ce sens. Il n'importe ou ces collections ne serait pas beaucoup de sens.