Es el orden de los valores recuperados de un HashMap el orden de inserción

Estoy intentando averiguar el orden en que se recuperan los valores en un HashMap. Aquí está el fragmento de código para el mismo.

import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { HashMap hashmap = new HashMap(); hashmap.put(1, "apple" ); hashmap.put(2, "lemon" ); hashmap.put(3, "orange" ); hashmap.put(4, "banana" ); hashmap.put(5, "litchi" ); hashmap.put(6, "mango" ); hashmap.put(7, "papaya" ); System.out.println(hashmap.size()); for (String key : hashmap.values()) { System.out.println(key); } } } 

salida:

 7 apple lemon orange banana litchi mango papaya 

Los valores se imprimen en el orden en que se insertaron. ¿Es esto cierto en general? Esperaba que los valores se imprimieran en un orden arbitrario. Esto es usando Java 6.

Los valores se imprimen en el orden en que se insertaron. ¿Es esto cierto en general? Esperaba que los valores se imprimieran en orden aleatorio.

La API de HashMap no define el orden de iteración.

Sin embargo, si observa la implementación de HashMap, puede deducir que existe una relación transitoria compleja entre el orden de iteración, los valores hash de las claves, el orden en que se insertaron las claves y el tamaño de la tabla hash. Esta relación se codifica si la tabla hash se redimensiona.

En su caso, está utilizando claves Integer que significa que los valores hash de las claves son los valores clave en sí mismos. Además, insertó las entradas en el orden de las teclas. Esto conduce (¡fortuitamente!) Al orden de iteración que coincide con el orden de inserción. Pero si siguió insertando más teclas, encontrará que el orden de iteración “se ajusta”. Luego, a medida que la tabla pasa por una serie de cambios de tamaño, la orden se volverá cada vez más codificada.

En resumen, lo que está viendo es un artefacto de la implementación de hashtable, y no algo que usted pueda (o deba) usar sensiblemente. No menos importante porque podría cambiar de una versión de Java a la siguiente.

Desde la clase Javadoc: HashMap “no se garantiza el orden del mapa, en particular, no garantiza que el pedido se mantenga constante en el tiempo”.

Si necesita un pedido consistente, puede usar LinkedHashMap (para orden de inserción / acceso) o TreeMap (para orden de comparación). Tenga en cuenta que estos mantienen el orden de las claves, no los valores.

Un LinkedHashMap es lo que buscas. Desde el doco, difiere de HashMap en que mantiene una lista doblemente enlazada que se ejecuta a través de todas sus entradas

Pruebe LinkedHashMap si el orden es importante … vea de JavaDoc

la clase pública LinkedHashMap extiende HashMap

Tabla hash e implementación de lista enlazada de la interfaz de Mapa, con orden de iteración predecible. 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 las claves se insertaron 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. (Una clave k se reinserta en un mapa m si m.put (k, v) se invoca cuando m.containsKey (k) devolvería verdadero inmediatamente antes de la invocación).

Una colección relacionada es ConcurrentSkipListMap de java.util.concurrent. Un skiplist le permite recorrer las entradas en el orden de las teclas y también buscarlas en orden aleatorio (pero no tan rápido como un HashMap).

Hay un buen applet de demostración skiplist.