2010-08-13 12 views
33

Cuando se invoca LinkedHashMap.keySet(), ¿el orden del conjunto devuelto será el mismo que el orden en que se agregaron las claves?¿LinkedHashMap de Java mantiene el orden de las claves?

+0

Para aquellos que vienen de PHP, permítanme ayudarles señalando que un LinkedHashMap se comporta de manera muy similar a una matriz de PHP. –

Respuesta

44

Sí.

Ver: LinkedHashMap:

Esta lista enlazada define la iteración de pedido, que normalmente es del orden en el que las teclas se insertaron en el mapa (inserción orden).

y de la documentación HashMap#keySet:

El conjunto [regresó] está respaldado por el mapa, por lo cambios en el mapa se reflejan en el conjunto, y viceversa.

+2

@Tom gracias, todavía no estoy convencido de que esto sea explícito. ¿Por qué no LinkedHashMap.keySet() devolvería una subclase de Set con un orden fijo? – Armand

+4

Porque si devolviera SortedSet, LinkedHashMap agregaría el requisito de que sus claves sean de un tipo que implemente Comparable, o que se proporcione una función de comparación. Esto NO es requerido por Map. Consulte la documentación de SortedSet: http://download.oracle.com/javase/6/docs/api/java/util/SortedSet.html. No tener este requisito permite que incluso las claves que no implementan Comparable se utilicen en un LinkedHashMap, que es el caso más general. La implementación de LinkedHashMap incluso podría devolver un SortedSet si sus claves SON comparables, pero simplemente no es REQUERIDO. –

+1

Por supuesto, el contrato de LinkedHashMap dice que mantiene el orden de INSERCIÓN, que puede no ser el pedido NATURAL. Entonces, en ese caso, un SortedSet no funcionaría en absoluto; las claves simplemente no se ordenarían de esa manera. –

32

Yes. La excepción es que cuando se reinserta una tecla, aparece en el orden en que se insertó por primera vez en la lista.

+4

+1 Buena captura en esa caja de esquina. –

+3

En realidad, la excepción se aplica cuando la clave está ** reinsertada **, no se ha eliminado ni reutilizado.El caso es cuando llamas 'put (key, value)' para una clave que ya estaba en el mapa. (El javadoc lo explica claramente). –

Cuestiones relacionadas