English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explicación detallada de la ampliación de HashMap y ejemplo de código en java

Expansión de HashMap

Prefacio:

Cuando el tamaño de HashMap es mayor o igual a(Capacidad*Factor de carga) desencadenará la operación de expansión, lo que es una operación de gran costo.

¿Por qué expandir?63;La capacidad predeterminada de HashMap es16,a medida que se agregan más elementos al HashMap, la probabilidad de conflicto de hash aumenta, por lo que la lista correspondiente a cada bucket será más larga,

Esto afectará el rendimiento de la consulta, porque cada vez que se necesita recorrer la lista, comparar si los objetos son iguales hasta encontrar el elemento.

Para mejorar el rendimiento de la consulta, solo se puede expandir, reducir el conflicto de hash y distribuir el key de los elementos lo más uniformemente posible.

Puntos básicos de expansión

El valor predeterminado del factor de carga es 0.75

static final float DEFAULT_LOAD_FACTOR = 0.75f;

El valor predeterminado de la capacidad es16

 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // =16

HashMap proporciona un parámetro de construcción, que se puede especificar la capacidad y el factor de carga al crear.

 public HashMap(int initialCapacity, float loadFactor)

Por defecto, cuando el tamaño de HashMap es mayor o igual a16*0.75=12es decir,

y cuando al menos hay un elemento en cada Entry (o bucket), se realiza la expansión.

 if ((size >= threshold) && (null != table[bucketIndex])) {
      resize(2 * table.length);
      hash = (null != key) ? hash(key) : 0;
      bucketIndex = indexFor(hash, table.length);
}

Al expandir, la capacidad del contenedor se duplica

 resize(2 * table.length);

Al expandir, es necesario recalcular el índice del elemento en el array

1、asignar un nuevo array Entry
2、recalcular el índice del elemento original en el nuevo array(Muy exigente en recursos)

Gracias por leer, espero que pueda ayudar a todos, gracias por el apoyo a este sitio!

Te gustará