Cómo responder cómo funciona HashMap en una entrevista
¿Por qué ConcurrentHashMap de JAVA8 renunció al bloqueo de segmentación? ¿Cuál es el problema? Si estuvieras diseñando, ¿qué harías?
Diseño.
¿Existen clases de implementación de mapas secuenciales? Si es así, ¿cómo garantizan el orden?
El principio de implementación de hashmap, /mbshqqq b/article/details/79799009
El siguiente es mi propio resumen:
Estructura de almacenamiento:
En él se almacena una matriz de entradas y la estructura de cada elemento de la matriz es una lista vinculada de entradas.
Entry es una clase interna estática en map, cuyas variables son: clave, valor, hashcocd y next Entry.
¿Qué es un hash?
También conocido como hash, una entrada de cualquier longitud se convierte en una salida de longitud fija mediante un algoritmo hash, y la salida es un valor hash. Este es un mapa comprimido y el espacio del valor hash suele ser mucho más pequeño que el espacio de salida. Diferentes entradas pueden incluir la misma salida, por lo que no se puede determinar un valor de entrada único a partir del hash. Es por eso que al comparar dos objetos no se puede usar solo el método de código hash para comparar.
Colisiones de hash:
El hash de diferentes valores producirá el mismo valor de hash. Esto es inevitable, pero debemos minimizar sus pérdidas.
(1) El algoritmo hash está diseñado para que se distribuya lo más uniformemente posible.
Análisis del algoritmo hash en hashmap
Hash int final estático (clave de objeto) {
int h
return (key =; = nulo)? 0:(h = key . hashcode())^(h & gt;& gt& gt16);
}
Cambie el código hash de la clave 16 bits a la derecha para mezclarlo. Los bits altos y bajos aumentan la aleatoriedad de los bits bajos mientras mantienen disfrazadas las características de los bits altos.
Algoritmo para calcular la posición del elemento:
int index = hash & amp(array.length-1);
Entonces queda claro por qué la longitud de la matriz de HashMap es una potencia entera de 2. Por ejemplo, si la longitud inicial es 16, entonces 16-1 = 15 y el número binario para 15 es 000000000000000000000165438. Como puede verse, el último dígito del binario de base debe ser 1. Al realizar AND con valores hash, el último bit puede ser 0 o 1. Sin embargo, el último bit de la operación AND entre el número par y el valor hash debe ser 0, lo que da como resultado que algunas ubicaciones nunca mapeen un valor.
Manejo de valores nulos
Hashmap acepta valores nulos y estos valores se colocan en el primer elemento de la matriz. ¿Qué debo hacer cuando los saque?
¿Cómo funciona hashmap?
Hay una matriz de entrada en su interior. Al ponerlo, primero calculamos el código hash según el valor clave, luego calculamos la posición del elemento en la matriz y encapsulamos el par clave-valor en un mapa. objeto de entrada y guárdelo en una matriz.
¿Qué pasa si hay una colisión de hash?
La posición de cada elemento de la matriz es una estructura de lista vinculada. Si el código hash calculado es el mismo, el elemento se agrega a la lista vinculada. Este es el método de procesamiento de hashmap.
Al buscar un elemento, primero calcule el código hash correspondiente al valor clave para encontrar la posición del elemento, luego llame al método igual de la clave para recorrer la lista vinculada y finalmente encuentre el elemento.
¿Qué otras formas de resolver colisiones de hash?
Método de direccionamiento abierto
Este método también se llama repetición.
La idea básica es: cuando la dirección hash p=H(clave) de la clave de la palabra clave entra en conflicto, se genera otra dirección hash p1 basada en P. Si p1 aún entra en conflicto, se genera otra dirección hash p2 basada en P hasta que se encuentre que no entra en conflicto La dirección hash pi y el elemento correspondiente se almacenan en ella.
Método Rehash
Este método construye varias funciones hash diferentes al mismo tiempo:
Hi=RH1(key) i=1, 2 ,... , k
Cuando la dirección hash Hi = RH1 (clave) entra en conflicto, calcule hi = rh2 (clave)... hasta que el conflicto ya no ocurra. Este método es menos propenso a la agregación, pero aumenta el tiempo de cálculo.
Método de dirección de cadena
La idea básica de este método es formar todos los elementos con dirección hash I en una lista enlazada individualmente llamada cadena de sinónimos y establecer el puntero principal. de la lista enlazada individualmente Se almacena en la unidad I de la tabla hash, por lo que la búsqueda, inserción y eliminación se realizan principalmente en la cadena de sinónimos. El método de dirección en cadena es adecuado para inserciones y eliminaciones frecuentes.
Establecer un área de desbordamiento pública
La idea básica de este método es dividir la tabla hash en dos partes: la tabla básica y la tabla de desbordamiento. Todos los elementos que entran en conflicto. La tabla básica se completa en el área de desbordamiento.
El factor de carga predeterminado es 0,75
Cuando el tamaño de la textura excede el 75% de la capacidad actual, se expandirá automáticamente y los objetos originales se volverán a colocar en la nueva matriz. .
¿Cuál es el proceso de refrito?
Para decirlo sin rodeos, primero se ajusta el tamaño para generar una nueva matriz de entrada, luego se transfieren y recalculan los valores de la matriz original a la nueva matriz y luego se cambia el umbral. a la nueva longitud x factor de carga.
Si la clave está vacía, siempre se incluirá en el depósito de la tabla [0], incluso durante el proceso de repetición. Las claves no vacías también se pueden aplicar hash a la posición de la tabla [0], como key = "f" en la figura anterior. La misma clave también se puede aplicar hash a diferentes posiciones en diferentes momentos, lo cual está relacionado con el refrito.
¿Qué problemas es probable que surjan en este proceso?
Es probable que se produzca competencia condicional. Si se agregan datos durante el proceso de expansión, pueden ocurrir resultados inesperados. O si ambos subprocesos activan la expansión de la capacidad, habrá problemas.
¿Has encontrado algún buen ejemplo de esto?
Después de jdk1.8, se cambió a árbol rojo-negro. ¿Por qué? ¿Hablar sobre el principio de los árboles rojo-negros?
¿Cuál es la diferencia entre hashmap y hashtable?
Los principios de implementación de HashTable y HashMap son casi los mismos, la única diferencia es que
HashTable no permite claves y valores vacíos.
Las tablas hash son seguras para subprocesos.
Sin embargo, la estrategia de seguridad de subprocesos de HashTable es demasiado costosa, simple y tosca. Todas las operaciones relacionadas de get/put son sincrónicas, lo que equivale a agregar un gran bloqueo a toda la tabla hash.
Durante el acceso de subprocesos múltiples, siempre que un subproceso acceda u opere el objeto, otros subprocesos solo pueden bloquearse, lo que equivale a serializar todas las operaciones, y el rendimiento será muy pobre en escenarios de concurrencia competitivos.
El cupo es limitado y se mantendrá.