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?
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?
Respuestas:
La interfaz de Mapa proporciona tres vistas de colección , que permiten que los contenidos de un mapa se vean como un conjunto de claves, una colección de valores o un conjunto de asignaciones de clave-valor. El orden de un mapa se define como el orden en el que los iteradores en las vistas de colección del mapa devuelven sus elementos. Algunas implementaciones de mapas, como la
TreeMap
clase, ofrecen garantías específicas en cuanto a su orden; otros, como laHashMap
clase, no lo hacen.
- Mapa
Esta lista vinculada define el orden de iteración, que normalmente es el orden en que se insertaron las claves en el mapa ( orden de inserción ).
Así que, sí, keySet()
, values()
, y entrySet()
(las tres vistas de recogida mencionado) valores de retorno en el orden de los usos internos lista enlazada. Y sí, el JavaDoc lo garantiza Map
y lo LinkedHashMap
garantiza.
Ese es el punto de esta clase, después de todo.
Collection
es solo la clase base de los valores que devuelve (). La implementación de la Colección que devuelve aún está controlada por LinkedHashMap
. En LinkedHashMap
el caso, está devolviendo una LinkedValues
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()
y entrySet()
todos usan el mismo iterador de entrada internamente.
¡No se confunda con LinkedHashMap.keySet()
y LinkedHashMap.entrySet()
devuelva Set y, por lo tanto, no debería garantizar el pedido!
Set
es una interfaz con HashSet
, TreeSet
etc seres sus implementaciones. La HashSet
implementación de la Set
interfaz no garantiza el pedido. Pero lo TreeSet
hace. También lo LinkedHashSet
hace
Por lo tanto, depende de cómo Set
se haya implementado LinkedHashMap
para saber si la referencia Set establecida garantizará el pedido o no. Revisé el código fuente de LinkedHashMap
, se ve así:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
Por lo tanto, LinkedHashMap / HashMap tiene su propia implementación de Set
ie KeySet
. Por lo tanto, no confunda esto con HashSet
.
Además, el orden se mantiene por cómo se insertan los elementos en el cubo. Mire el addEntry(..)
método LinkedHashMap
y compárelo con el HashMap
que resalta la diferencia principal entre HashMap
y LinkedHashMap
.
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.
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.
Mirando la interfaz, devuelve un simple Set
y no un SortedSet
. 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.
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.
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.
values()
, así comokeySet()
, he ampliado la cuestión de incluir eso. Esto significa que se pueden cerrar más preguntas como duplicados de esto.