Sé que LinkedHashMaptiene un orden de iteración predecible (orden de inserción). ¿El Setdevuelto por LinkedHashMap.keySet()y el Collectiondevuelto por LinkedHashMap.values()también mantienen este orden?
java
iteration
linkedhashmap
usuario256239
fuente
fuente

values(), así comokeySet(), he ampliado la cuestión de incluir eso. Esto significa que se pueden cerrar más preguntas como duplicados de esto.Respuestas:
- Mapa
- LinkedHashMap
Así que, sí,
keySet(),values(), yentrySet()(las tres vistas de recogida mencionado) valores de retorno en el orden de los usos internos lista enlazada. Y sí, el JavaDoc lo garantizaMapy loLinkedHashMapgarantiza.Ese es el punto de esta clase, después de todo.
fuente
Collectiones solo la clase base de los valores que devuelve (). La implementación de la Colección que devuelve aún está controlada porLinkedHashMap. EnLinkedHashMapel caso, está devolviendo unaLinkedValuesinstancia, una clase privada dentro de LinkedHashMap.java.Map) que vincula explícitamente el orden de un mapa a los iteradores en las vistas de colección del mapa (y dejar en claro cuáles son esas vistas de colección). Esa fue la pieza que faltaba para mí.Mirando la fuente, parece que sí.
keySet(),values()yentrySet()todos usan el mismo iterador de entrada internamente.fuente
¡No se confunda con
LinkedHashMap.keySet()yLinkedHashMap.entrySet()devuelva Set y, por lo tanto, no debería garantizar el pedido!Setes una interfaz conHashSet,TreeSetetc seres sus implementaciones. LaHashSetimplementación de laSetinterfaz no garantiza el pedido. Pero loTreeSethace. También loLinkedHashSethacePor lo tanto, depende de cómo
Setse haya implementadoLinkedHashMappara saber si la referencia Set establecida garantizará el pedido o no. Revisé el código fuente deLinkedHashMap, se ve así:Por lo tanto, LinkedHashMap / HashMap tiene su propia implementación de
SetieKeySet. Por lo tanto, no confunda esto conHashSet.Además, el orden se mantiene por cómo se insertan los elementos en el cubo. Mire el
addEntry(..)métodoLinkedHashMapy compárelo con elHashMapque resalta la diferencia principal entreHashMapyLinkedHashMap.fuente
Puedes suponer que sí. El Javadoc dice 'orden de iteración predecible', y los únicos iteradores disponibles en un Mapa son aquellos para keySet (), entrySet () y values ().
Por lo tanto, en ausencia de cualquier calificación adicional, está claramente destinado a aplicarse a todos esos iteradores.
fuente
AFAIK no está documentado, por lo que no puede asumirlo "formalmente". Sin embargo, es poco probable que la implementación actual cambie.
Si desea garantizar el orden, es posible que desee iterar sobre las entradas del mapa e insertarlas en un conjunto ordenado con una función de orden de su elección, aunque naturalmente pagará un costo de rendimiento.
fuente
Mirando la interfaz, devuelve un simple
Sety no unSortedSet. Entonces no hay garantías.Antes de asumir una garantía implícita al observar la implementación (siempre es una mala idea), observe también las implementaciones en todas las demás implementaciones de Java :)
Podría crear mejor, por ejemplo, un TreeSet con keySet en el constructor.
fuente
No creo que pueda presumir el orden de keySet () y values ().
Puedo escribir fácilmente una implementación de LinkedHashMap que te devuelva keySet () y valores () desordenados, siempre que cumpla con el contrato de estos dos métodos que se definen en Map y se anulan en HashMap.
fuente
LinkedHashMapclase es mantener el orden de los elementos mientras se itera el mapa y este comportamiento está bien especificado. Si escribe una subclase sin cumplir con la especificación de la clase base, entonces está haciendo algo muy mal.