Collections Java maintenant l’ordre d’insertion

Pourquoi certaines structures de données de collection ne conservent-elles pas l’ordre d’insertion? Quelle est la particularité obtenue par rapport au maintien de l’ordre d’insertion? Est-ce que nous gagnons quelque chose si nous ne maintenons pas la commande?

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

Les collections ne conservent pas l’ordre d’insertion. Certains ajoutent simplement une nouvelle valeur à la fin. Le maintien de l’ordre d’insertion n’est utile que si vous hiérarchisez les objects ou si vous les utilisez pour sortinger les objects.

En ce qui concerne les raisons pour lesquelles certaines collections le conservent par défaut et d’autres pas, cela est principalement dû à l’implémentation et ne fait parfois que partie de la définition des collections.

  • Les listes maintiennent l’ordre d’insertion car l’ajout d’une nouvelle entrée à la fin ou au début est l’implémentation la plus rapide de la méthode add (Object).

  • Ensembles Les implémentations HashSet et TreeSet ne maintiennent pas l’ordre d’insertion car les objects sont sortingés pour une recherche rapide et le maintien de l’ordre d’insertion nécessite de la mémoire supplémentaire. Cela se traduit par un gain de performance car l’ordre d’insertion n’est presque jamais intéressant pour les ensembles.

  • ArrayDeque un deque peut être utilisé pour le simple que et la stack, donc vous voulez avoir le comportement «first in first out» ou «first in last out», les deux exigent que ArrayDeque maintienne l’ordre d’insertion. Dans ce cas, l’ordre d’insertion est conservé comme partie centrale du contrat de classes.

  • L’ordre d’insertion n’est pas insortingnsèquement maintenu dans les tables de hachage – c’est exactement ce qui fonctionne (lisez l’article lié pour comprendre les détails). Il est possible d’append de la logique pour maintenir l’ordre d’insertion (comme dans LinkedHashMap ), mais cela prend plus de code et, au moment de l’exécution, plus de mémoire et plus de temps. La perte de performance n’est généralement pas significative, mais cela peut être le cas.
  • Pour TreeSet/Map , la principale raison de les utiliser est l’ordre d’itération naturel et d’autres fonctionnalités ajoutées dans l’interface SortedSet/Map .

Dépend de ce dont vous avez besoin pour que la mise en œuvre réussisse. L’ordre d’insertion n’est généralement pas intéressant, il n’est donc pas nécessaire de le maintenir, vous pouvez donc 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 des petits groupes faciles à rechercher. Le TreeMap conserve un ordre sortingé des entrées insérées au prix d’une recherche plus lente, mais plus facile à sortinger qu’un HashMap.

Lorsque vous utilisez un HashSet (ou un HashMap), les données sont stockées dans des “compartiments” basés sur le hachage de votre object. De cette façon, vos données sont plus faciles d’access 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 le rendre meilleur à 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 devez utiliser une implémentation qui ne le propose pas et qui correspond mieux à vos besoins.

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

Theres est une section du livre de recettes Java d’O’Reilly intitulée “Éviter le besoin de sortinger” La question que vous devriez vous poser est en réalité l’opposé de votre question initiale … “Est-ce que nous gagnons quelque chose en sortingant?” Il faut beaucoup d’efforts pour sortinger et maintenir cet ordre. Bien sûr, le sorting est facile, mais il n’est généralement pas adapté à la plupart des programmes. Si vous comptez gérer des milliers ou des dizaines de milliers de requêtes (entrantes, sortantes, récupérées, etc.) par seconde, que vous n’utilisiez pas une structure de données sortingée ou non sortingée, cela aura une grande importance.

certaines collections ne conservent pas la commande à cause de, elles calculent le hashCode du contenu et le stockent en conséquence dans le compartiment approprié.

Je ne peux pas citer une référence, mais par définition, les implémentations List et Set de l’interface Collection sont fondamentalement extensibles. Comme les Collections par défaut offrent des méthodes pour append et supprimer dynamicment des éléments à n’importe quel point – ce que l’ordre d’insertion de Array pourrait ne pas conserver. Ainsi, comme il existe davantage de méthodes de manipulation de contenu, il est nécessaire de mettre en œuvre des implémentations spéciales préservant l’ordre.

Un autre point est la performance, car la Collection la plus performante peut ne pas être celle qui conserve son ordre d’insertion. Je ne suis toutefois pas sûr, comment exactement les Collections gèrent leur contenu pour augmenter les performances.

Donc, en bref, les deux principales raisons pour lesquelles je peux penser à la raison pour laquelle il existe des implémentations de Collection préservant l’ordre sont les suivantes:

  1. Architecture de classe
  2. Performance

Okay … donc ces articles sont anciens par rapport à maintenant, mais l’ordre d’insertion est nécessaire en fonction de vos besoins ou des exigences de l’application, donc utilisez simplement le bon type de collection. Pour la plupart, cela n’est pas nécessaire, mais dans une situation où vous devez utiliser des objects dans l’ordre dans lequel ils ont été stockés, je constate un besoin certain. Je pense que l’ordre est important lorsque vous créez, par exemple, un assistant ou un moteur de stream, ou quelque chose de ce genre, où vous devez passer d’un état à un autre. En ce sens, vous pouvez lire des éléments de la liste sans avoir à suivre ce dont vous avez besoin ou parcourir une liste pour trouver ce que vous voulez. Cela aide à la performance en ce sens. Cela importe peu, sinon ces collections n’auraient pas beaucoup de sens.