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?
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?
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
TreeMapclase, ofrecen garantías específicas en cuanto a su orden; otros, como laHashMapclase, 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 Mapy lo LinkedHashMapgarantiza.
Ese es el punto de esta clase, después de todo.
Collectiones 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 LinkedHashMapel caso, está devolviendo una LinkedValuesinstancia, 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!
Setes una interfaz con HashSet, TreeSetetc seres sus implementaciones. La HashSetimplementación de la Setinterfaz no garantiza el pedido. Pero lo TreeSethace. También lo LinkedHashSethace
Por lo tanto, depende de cómo Setse haya implementado LinkedHashMappara 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 Setie 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 LinkedHashMapy compárelo con el HashMapque resalta la diferencia principal entre HashMapy 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 Sety 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.
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.
values(), así comokeySet(), he ampliado la cuestión de incluir eso. Esto significa que se pueden cerrar más preguntas como duplicados de esto.