Sé que LinkedHashMap
tiene un orden de iteración predecible (orden de inserción). ¿El Set
devuelto por LinkedHashMap.keySet()
y el Collection
devuelto 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 garantizaMap
y loLinkedHashMap
garantiza.Ese es el punto de esta clase, después de todo.
fuente
Collection
es solo la clase base de los valores que devuelve (). La implementación de la Colección que devuelve aún está controlada porLinkedHashMap
. EnLinkedHashMap
el caso, está devolviendo unaLinkedValues
instancia, 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!Set
es una interfaz conHashSet
,TreeSet
etc seres sus implementaciones. LaHashSet
implementación de laSet
interfaz no garantiza el pedido. Pero loTreeSet
hace. También loLinkedHashSet
hacePor lo tanto, depende de cómo
Set
se haya implementadoLinkedHashMap
para 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
Set
ieKeySet
. 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étodoLinkedHashMap
y compárelo con elHashMap
que resalta la diferencia principal entreHashMap
yLinkedHashMap
.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
Set
y 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
LinkedHashMap
clase 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.