La estructura de datos subyacente y los parámetros principales de HashMap
2. Puede almacenar claves nulas y valores nulos.
? 3. ¿Inseguridad lineal
? 4. La capacidad inicial es 16 y la expansión es siempre una potencia de 2 (operación de bits garantizada).
? 5. Cuando el factor de carga es 0,75, la operación de expansión se activará cuando el número total de elementos en el mapa exceda 0,75 de la matriz de entrada.
? 6. En el caso de concurrencia, la operación de colocación de HashMap provocará un bucle infinito, lo que hará que la utilización de la CPU se acerque a 100.
? (1) La estructura de datos subyacente de HashMap tiene la forma de una lista enlazada de matriz. En JDK8 y versiones posteriores, se utilizan matrices, listas vinculadas y árboles rojo-negro para resolver el problema de la velocidad de consulta lenta causada por listas vinculadas largas.
? (2) En pocas palabras, HashMap consta de una matriz y una lista vinculada. La matriz es el cuerpo principal de HashMap y la lista vinculada existe principalmente para resolver conflictos de hash. HashMap obtiene el valor hash a través del HashCode de la clave procesada por la función de perturbación y luego determina la ubicación de almacenamiento del elemento actual mediante operaciones de bits. Si hay un elemento en la posición actual, se juzga si el valor hash y la clave del elemento y el elemento que se va a almacenar son los mismos, se sobrescriben directamente. el conflicto se resuelve mediante el método de la cremallera. La operación de expansión se activa cuando el número total de elementos en el mapa excede 0,75 de la matriz de entradas. Para reducir la longitud de la lista vinculada, los elementos se distribuyen de manera más uniforme.
DEFAULT_INITIAL_CAPACITY: Capacidad de inicialización predeterminada 1
MAXIMUM_CAPACITY: Capacidad máxima 1
? DEFAULT_LOAD_FACTOR: el factor de carga predeterminado, que el diseñador considera el mejor valor en función del consumo de tiempo y espacio. El producto de este valor y la capacidad es un valor muy importante, el umbral. Cuando se alcance este valor, la capacidad se ampliará, aproximadamente el doble.
TREEIFY_THRESHOLD: a partir de jdk8, la estructura de almacenamiento subyacente de HashMap se ha cambiado a la estructura de almacenamiento de matriz, lista vinculada y árbol rojo-negro (anteriormente era matriz, lista vinculada). Primero, cuando los elementos de almacenamiento entran en conflicto, se colgará una lista vinculada detrás de la matriz en conflicto. Cuando la longitud de la lista vinculada es mayor que este parámetro, la lista vinculada se puede convertir en un árbol rojo-negro. ¿Por qué es posible que haya un parámetro al final y la conversión se producirá solo cuando ambos se cumplan?
UNTREEIFY_THRESHOLD: Al introducir los parámetros anteriores, sabemos que cuando la longitud es demasiado grande, puede haber una conversión de una lista vinculada a un árbol rojo-negro, pero no solo se pueden agregar elementos sino también eliminado, o en otro caso, No hay muchos datos de elementos en las ranuras de la matriz expandida, por lo que usar la estructura de árbol rojo-negro será un gran desperdicio. En este momento, la estructura de árbol rojo-negro se puede volver a cambiar a la. Estructura de la lista vinculada. ¿Cuándo se cambiará? Es decir, cuando el número de elementos es igual a este valor (es decir, 6), vuelve a cambiar (el número de elementos es el número en la ranura de la matriz, no el número de todos los elementos en el HashMap).
MIN_TREEIFY_CAPACITY: Estándar para la formación de árboles de listas enlazadas. Como se mencionó anteriormente, cuando el número de elementos en la ranura de la matriz es mayor que 8, se puede convertir en un árbol rojo-negro. La razón es que cuando la longitud de la matriz es menor que este valor, se extenderá primero. Después de la expansión, es probable que los datos en las ranuras de la matriz puedan estar más dispersos, por lo que no es necesario modificar la estructura de almacenamiento después de la ranura de la matriz. Por supuesto, cuando la longitud es mayor que este valor y los datos en la ranura son mayores que 8, se convertirá en un árbol rojo-negro.