2010-08-13 26 views
33

Lorsque LinkedHashMap.keySet() est appelé, l'ordre de l'ensemble retourné sera-t-il le même que l'ordre dans lequel les clés ont été ajoutées?Est-ce que LinkedHashMap de Java maintient l'ordre des clés?

+0

Pour ceux qui viennent de PHP, permettez-moi de les aider en soulignant qu'un LinkedHashMap se comporte très bien comme un tableau PHP. –

Répondre

44

Oui.

Voir: LinkedHashMap:

Cette liste chaînée définit l'itération commande, qui est normalement l'ordre dans lequel les clés ont été insérées dans la carte (insertion d'ordre).

et de la documentation HashMap#keySet:

L'ensemble [retourné] est soutenu par la carte, de sorte modifications apportées à la carte sont reflétés dans l'ensemble , et vice-versa.

+2

@Tom merci, je ne suis toujours pas convaincu que c'est explicite. Pourquoi LinkedHashMap.keySet() ne retournerait-il pas une sous-classe de Set avec un ordre fixe? – Armand

+4

Parce que si elle renvoyait un SortedSet, LinkedHashMap ajouterait l'exigence que ses clés soient d'un type qui implémente Comparable, ou qu'une fonction de comparaison soit fournie. Ceci n'est pas requis par Map. Consultez la documentation de SortedSet: http://download.oracle.com/javase/6/docs/api/java/util/SortedSet.html. Ne pas avoir cette exigence permet même aux clés qui n'implémentent pas Comparable d'être utilisées dans un LinkedHashMap, ce qui est le cas le plus général. L'implémentation de LinkedHashMap peut même renvoyer un SortedSet si ses clés sont comparables, mais ce n'est pas OBLIGATOIRE. –

+1

Bien sûr, le contrat de LinkedHashMap indique qu'il maintient la commande INSERTION, qui peut ne pas être la commande NATURELLE. Donc, dans ce cas, un SortedSet ne fonctionnerait pas du tout --- les clés ne seraient tout simplement pas triées de cette manière. –

32

Yes. L'exception est que lorsqu'une clé est réinsérée, elle apparaît dans l'ordre dans lequel elle a été insérée pour la première fois dans la liste.

+4

+1 Bonne prise sur ce cas de coin. –

+3

En fait, l'exception est pour lorsque la clé est ** réinsérée **, non supprimée et réutilisée.Le cas est lorsque vous appelez 'put (clé, valeur)' pour une clé qui était déjà dans la carte. (Le javadoc l'explique clairement.) –