Primero de todo: HashMap
específicamente no proporcionar una ordenación estable y/o definido. Entonces, cualquier cosa que observe es simplemente un detalle de implementación y usted no debe depender de ello de ninguna manera.
Dado que a veces es útil saber la razón de la ordenación aparentemente al azar, aquí está la idea básica:
Un HashMap
tiene número de cubos (implementado como una matriz) en el que almacenar las entradas.
Cuando se agrega un artículo al mapa, se asigna a los depósitos según el valor derivado de su hashCode
y el tamaño del cubo del HashMap
. (Tenga en cuenta que es posible que la cubeta ya esté ocupada, lo que se conoce como colisión. Se maneja con gracia y correctamente, pero ignoraré ese manejo para la descripción porque no cambia el concepto).
El ordenamiento percibido de las entires (como las devueltas al iterar sobre el Map
) depende del orden de las entradas en esos segmentos.
Cada vez que se rehice el tamaño (porque el mapa excedió su umbral de plenitud), el número de depósitos cambia, lo que significa que la posición de cada elemento puede cambiar, ya que la posición del cubo también se deriva del número de segmentos .
, pero un Hashmap sigue la misma secuencia predecible cada vez ... ¿por qué? –
@pop stack HashMap no garantiza el pedido. Consulte la respuesta de Stephen C en http://stackoverflow.com/questions/2144776/order-of-values-retrieved-from-a-hashmap para obtener detalles sobre cómo y por qué podría cambiar. –
¡Este tipo de respuesta es genial! Una hoja de trucos sería increíble para enumerar las diferencias entre todos los mapas, listas, ¡establecidos en Java! –