Hash de HashMap del código fuente de Java

Cuando se trata de hash, hay una forma en la que inmediatamente parpadearemos en nuestras cabezas, es decir hashCode(), sí. ¡Eso es todo!
Sabemos que HashMap almacena datos a través de la estructura de matriz + lista enlazada. Si hay una matriz, habrá un índice. El índice de los datos en el HashMap se hashcalcula en base al método interno del HashMap .
No  get put podemos prescindir de este  hash método.
¡Empecemos por el hashmétodo!

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

Primero hashCode() consígalo a través del  método  h , luego mueva la h sin signo 16 bits a la derecha y finalmente obtenga el valor hash a través del algoritmo XOR. Busquemos una clave para expandir la operación.
Suponga que hay una clave

String key = "hello world";

Luego, el valor binario del código hash de esta clave es
0110 1010 1110 1111 1110 0010 1100 0100
y luego mueva estos datos binarios a los 16 bits sin signo de la derecha, y obtenga el siguiente
0000 0000 0000 0000 0110 1010 1110 1111 y
finalmente haciendo los 16 bits altos y los 16 bits bajos La operación XOR se distribuye uniformemente
0110 1010 1110 1111 1000 1000 0010 1011 La
operación XOR para el hash es principalmente para reducir la probabilidad de conflictos de hash (esto se aprende consultando los datos)

Una vez que hayamos terminado hashel proceso de cálculo, echemos un vistazo a dónde es útil HashMap.

public V get(Object key) {
    Node<K,V> e;
    return (e = getNode(hash(key), key)) == null ? null : e.value;
}
public boolean containsKey(Object key) {
    return getNode(hash(key), key) != null;
}
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

Estos tres métodos se pueden considerar como los tres métodos más utilizados en HashMap. Puede ver que todas las claves pasadas desde la capa de aplicación han sido pasadas. Aquellos hash(key)que son más cuidadosos también encontrarán que el índice de la matriz en HashMap es a través de i = ( n-1) y hash calculado

Expandamos la fórmula de cálculo del índice
n es la longitud de la tabla hash en HashMap, el valor predeterminado es 16, cada expansión es el doble de la expansión, que es 16 << 1, usamos 16 para expandir la operación, y Hash usa la tecla anterior para continuar el cálculo

i = (16 - 1) y hash

El resultado binario de 15 es
0000 0000 0000 0000 0000 0000 0000 1111

Tome el hash y úselo de nuevo ~ (decimal: 1794082859)
0110 1010 1110 1111 1000 1000 0010 1011

A través de la operación, puede obtener (decimal: 11)
0000 0000 0000 0000 0000 0000 0000 1011

Cálculo decimal:
1794082859 & 15 = 11
1794082859% 16 = 11

Primero que nada, la configuración de n en HashMap es siempre la potencia de 2, porque la potencia de 2 & hash (clave) es equivalente a hash (clave)% n
. Como todos sabemos, & es 10 veces más eficiente que%.
Pero esta fórmula solo es válida cuando n es la potencia de 2, por lo que se establece la potencia de 2.

Todos los índices de HashMap se obtienen mediante este algoritmo, por lo que HashMap es muy rápido de encontrar ~

Bueno, a través de este artículo, todos también deberían tener una pequeña idea sobre el hash de HashMap.

Supongo que te gusta

Origin blog.csdn.net/a159357445566/article/details/108601854
Recomendado
Clasificación