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