2009-07-27 14 views
56

Estoy usando un linkedHashMap para garantizar el pedido cuando alguien intenta acceder a él. Sin embargo, cuando llega el momento de iterar, ¿el uso de entrySet() para devolver los pares de clave/valor también garantiza el orden? No se realizarán cambios durante la iteración.¿entrySet() en un LinkedHashMap también garantiza el orden?

EDIT: Además, ¿hay algún efecto adverso al recorrer el mapa iterando a través de sus teclas y llamando a get?

+0

Estaba a punto de hacer la misma pregunta, pero ¿por qué preguntar si alguien más ya me preguntó y recibió una buena respuesta? +1 para una buena pregunta. – uTubeFan

+0

En LinkedHashMap puede usar insert-order y access-order. El orden se mantiene siempre. Por favor, cubra mi [Vida interna de LinkedHashMap] (http://volodial.blogspot.com/2013/07/internal-life-of-linkedhashmap-in-java.html) tutorial –

+0

Posible duplicado de [Es la orden garantizada para el devolución de claves y valores de un objeto LinkedHashMap?] (http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a- linkedhashmap-o) – Roland

Respuesta

43

Según la Javadocs, sí .

Esta implementación difiere de HashMap en que mantiene una lista doblemente enlazada que se ejecuta a través de todas sus entradas. Esta lista vinculada define el orden de iteración, que normalmente es el orden en el que se insertaron las claves en el mapa (orden de inserción).

En cuanto a la edición, no, debería funcionar bien. Pero el conjunto de entradas es algo más rápido, ya que evita la sobrecarga de buscar cada tecla en el mapa durante la iteración.

+11

pero entrySet devuelve un conjunto que no está ordenado? –

+3

Sí, técnicamente el conjunto de entradas no tiene forma de acceder a una posición, pero entrySet.iterator() sí lo hace. El iterador nos permite tener una lista ordenada. – Jpatrick

+2

Me gustaría saber que esta respuesta es correcta, pero como señaló Jonathan, 'entrySet()' devuelve un conjunto. Jpatrick dice que el iterador del conjunto nos permite tener una lista ordenada, pero http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator() dice "Los elementos se devuelven sin orden particular (a menos que este conjunto sea una instancia de alguna clase que proporcione una garantía) ". Y ninguno de los documentos a los que se hace referencia aquí dice que entrySet() devuelve un conjunto que es una instancia de una clase que garantiza el orden. ¿Me estoy perdiendo de algo? – LarsH

1

Esta lista vinculada define el orden de las iteraciones, que normalmente es el orden en el que se insertaron las claves en el mapa (orden de inserción). Tenga en cuenta que el orden de inserción no se ve afectado si una clave se vuelve a insertar en el mapa. (A clave k se reinserta en un mapa m si m.put (k, v) se invoca cuando m.containsKey (k) volvería cierto inmediatamente antes de la invocación.)

1

Si está seguro de que no se realizarán cambios durante la iteración, se garantiza el pedido correcto con entrySet(), como se indica en API.

+1

Los documentos API a los que se vinculó para' entrySet() 'no dicen nada acerca de garantizar un orden correcto. La única declaración relacionada en esa página es "Esta clase [es decirHashMap] no garantiza el orden del mapa; en particular, no garantiza que la orden se mantendrá constante a lo largo del tiempo. "¿A qué se refería con ese enlace? – LarsH

Cuestiones relacionadas