JAVA — HashMap

Algunas notas de estudio sobre hashmap

1. El principio de implementación subyacente de HashMap

  En JDK1.7, HashMap se compone de una matriz y una lista vinculada. Después de JDK1.8, se agrega una estructura de composición de árbol rojo-negra. Cuando la lista vinculada es mayor que 8 y la capacidad es mayor que 64, la estructura de lista vinculada se convertirá en una estructura de árbol rojo-negro. .

  Los elementos de la matriz se denominan cubos hash, y cada cubo hash tiene cuatro campos, hash, clave, valor y el siguiente representa el siguiente nodo.

 

2. Optimización JDK1.8 de HashMap

  (1) Se agrega el árbol rojo-negro, porque la larga lista vinculada afectará el rendimiento de HashMap y reducirá la eficiencia, y el árbol rojo-negro tiene las características de rápida adición, eliminación y modificación, lo que puede mejorar efectivamente el problema de eficiencia.

  (2) Optimización de bucle muerto, el método de inserción de la lista vinculada se cambia a la inserción de secuencia positiva de cola

  (3) Optimiza la expansión, JDK1.8 elige utilizar la operación de orden superior e.hash & olcCap para determinar si el elemento debe moverse durante la expansión, en lugar de volver a calcular el valor hash.

Por ejemplo:

key1.hash = 10 0000 1010

oldCap = 16 0001 0000

El resultado más alto es 0, 0 significa que la posición del elemento no cambiará durante la expansión

key2.hash = 10 0001 0001

oldCap = 16 0001 0000

En este momento, el más alto es 1, lo que significa que la posición del elemento ha cambiado durante la expansión. La nueva posición del subíndice es igual a la posición del subíndice original + la longitud de la matriz original

 

3. HashMap bucle infinito

  La razón principal del bucle sin fin antes de JDK1.7 es que HashMap no es seguro para subprocesos y el método de inserción antes de JDK1.8 es la primera inserción inversa. Suponiendo que el tamaño predeterminado de un HashMap es 2, originalmente había una clave (5) y ahora se crean dos subprocesos: T1 agrega la clave del elemento (3) al HashMap, t2 agrega la clave del elemento (7) y t1 asigna el valor al siguiente. t2 obtiene el derecho de usar la CPU. En este momento, e en t1 apunta a la tecla (3), y luego apunta a la tecla (7). Luego t2 vuelve a ingresar y el orden de la lista vinculada se invierte. En este momento, la siguiente tecla (7) es la tecla (3). La consulta ha formado una llamada de bucle durante mucho tiempo, lo que resulta en un bucle sin fin.

 

Supongo que te gusta

Origin www.cnblogs.com/zucc-31701019/p/12705804.html
Recomendado
Clasificación