web-dev-qa-db-fra.com

Java collections conservant l'ordre d'insertion

Pourquoi certaines structures de données de collecte ne conservent-elles pas l'ordre d'insertion? Quelle est la particularité obtenue par rapport au maintien de l'ordre d'insertion? Avons-nous quelque chose à gagner si nous ne maintenons pas la commande?

47
JavaUser

Performance. Si vous souhaitez l'ordre d'insertion d'origine, il existe les classes LinkedXXX, qui conservent une liste liée supplémentaire dans l'ordre d'insertion. La plupart du temps, peu vous importe, vous utilisez donc un HashXXX, ou vous voulez un ordre naturel, vous utilisez donc TreeXXX. Dans l'un ou l'autre de ces cas, pourquoi devriez-vous payer le coût supplémentaire de la liste chaînée?

75
user207421

Les collections ne conservent pas l'ordre d'insertion. Certains ajoutent par défaut une nouvelle valeur à la fin. Le maintien de l'ordre d'insertion n'est utile que si vous hiérarchisez les objets par lui ou si vous l'utilisez pour trier les objets d'une manière ou d'une autre.

Quant à savoir pourquoi certaines collections le conservent par défaut et d'autres non, cela est principalement dû à l'implémentation et seulement parfois à la définition des collections.

  • Listes maintenir l'ordre d'insertion car l'ajout d'une nouvelle entrée à la fin ou au début est la mise en œuvre la plus rapide de la méthode add (Object).

  • Sets Les implémentations HashSet et TreeSet ne maintiennent pas l'ordre d'insertion car les objets sont triés pour une recherche rapide et le maintien de l'ordre d'insertion nécessiterait de la mémoire supplémentaire. Il en résulte un gain de performances car l'ordre d'insertion n'est presque jamais intéressant pour les Sets.

  • ArrayDeque un deque peut être utilisé pour les simples que et stack afin que vous souhaitiez avoir le comportement '' premier entré premier sorti '' ou '' premier entré dernier sorti '', les deux nécessitent que le ArrayDeque maintienne l'ordre d'insertion. Dans ce cas, l'ordre d'insertion est maintenu en tant que partie centrale du contrat de cours.

18
josefx
  • L'ordre d'insertion n'est intrinsèquement pas conservé dans tables de hachage - c'est exactement comme cela qu'elles fonctionnent (lisez l'article lié pour comprendre les détails). Il est possible d'ajouter de la logique pour maintenir l'ordre d'insertion (comme dans le LinkedHashMap), mais cela prend plus de code, et à l'exécution plus de mémoire et plus de temps. La perte de performances n'est généralement pas significative, mais elle peut l'être.
  • Pour TreeSet/Map, la principale raison de les utiliser est l'ordre d'itération naturel et les autres fonctionnalités ajoutées dans SortedSet/Map interface.
7
Michael Borgwardt

Cela dépend de ce dont vous avez besoin pour que l'implémentation fonctionne correctement. L'ordre d'insertion n'est généralement pas intéressant, il n'est donc pas nécessaire de le maintenir afin que vous puissiez le réorganiser pour obtenir de meilleures performances.

Pour les cartes, c'est généralement HashMap et TreeMap qui sont utilisés. En utilisant des codes de hachage, les entrées peuvent être placées dans de petits groupes faciles à rechercher. Le TreeMap maintient un ordre trié des entrées insérées au prix d'une recherche plus lente, mais plus facile à trier qu'un HashMap.

2

Lorsque vous utilisez un HashSet (ou un HashMap), les données sont stockées dans des "compartiments" en fonction du hachage de votre objet. De cette façon, vos données sont plus faciles d'accès car vous n'avez pas à rechercher ces données particulières dans l'ensemble, il vous suffit de regarder dans le bon compartiment.

De cette façon, vous pouvez augmenter les performances sur des points spécifiques.

Chaque implémentation de Collection a sa particularité de la rendre meilleure à utiliser dans une certaine condition. Chacune de ces particularités a un coût. Donc, si vous n'en avez pas vraiment besoin (par exemple l'ordre d'insertion), vous feriez mieux d'utiliser une implémentation qui ne la propose pas et s'adapte mieux à vos besoins.

2
Colin Hebert

Pourquoi est-il nécessaire de maintenir l'ordre d'insertion? Si vous utilisez HashMap, vous pouvez obtenir l'entrée par key. Cela ne signifie pas qu'il ne propose pas de cours qui font ce que vous voulez.

0
fastcodejava

Il y a une section dans le O'Reilly Java Cookbook appelé "Éviter l'envie de trier" La question que vous devriez poser est en fait l'opposé de votre question d'origine ... "Avons-nous quelque chose en tri? "Il faut beaucoup d'efforts pour trier et maintenir cet ordre. Bien sûr, le tri est facile, mais il n'est généralement pas mis à l'échelle dans la plupart des programmes. Si vous allez gérer des milliers ou des dizaines de milliers de demandes (insrt, del , get, etc.) par seconde, que vous n'utilisiez pas une structure de données triée ou non triée va sérieusement avoir de l'importance.

0
brown.2179

certaines collections ne maintiennent pas l'ordre à cause de, elles calculent le hashCode du contenu et le stockent en conséquence dans le compartiment approprié.

0
Abhishek Singh