El principio de funcionamiento de HASHMAP es una pregunta común de entrevista de Java en los últimos años. Casi todos los programadores de Java conocen hashmap, saben dónde usar hashmap y conocen la diferencia entre hashtable y hashmap. Entonces, ¿por qué esta pregunta de entrevista es tan especial? Esto se debe a que esta pregunta es muy profunda. Esta pregunta a menudo aparece en entrevistas avanzadas o de nivel intermedio. Los bancos de inversión prefieren hacer esta pregunta e incluso pueden pedirle que implemente HashMap para examinar sus habilidades de programación. La introducción de concurrenthashmap y otros conjuntos sincrónicos hace que este problema sea más complicado. ¡Comencemos el viaje de exploración!
Tengamos algunas preguntas simples primero
"¿Has usado hashmap?" "¿Qué es hashmap? ¿Por qué lo usaste?"
Casi todos responderán "sí", y luego responderán algunas características de hashmap, como hashmap pueden aceptar valores y valores de clave nulos, mientras que Hashtable no puede; Hashmap no es sincronizado; Hashmap es rápido; y HASHMAP almacena pares de valores clave, etc. Esto muestra que ha usado hashmap y está bastante familiarizado con él. Pero el entrevistador dio un giro rápido y comenzó a hacer algunas preguntas difíciles de ahora en adelante, sobre detalles más básicos de Hashmap. El entrevistador puede hacer las siguientes preguntas:
"¿Sabes cómo funciona Hashmap?" "¿Sabes cómo funciona el método Get () de Hashmap?"
Puede responder: "No busqué la API Java estándar en detalle, puede mirar el código fuente de Java o abrir JDK". "Puedo encontrar la respuesta con Google".
Pero algunos entrevistadores pueden dar la respuesta, "Hashmap se basa en el principio de hashing. Usamos PUT (clave, valor) para almacenar objetos en hashmap y usar Get (Key) para obtener objetos de HashMap. Cuando pasamos las claves y los valores al método PUT (), primero que Call the Hashcode () Método en la clave, y el retorno se usa para encontrar la ubicación de Bucket, el Bucket, la ubicación de Calling. El punto clave aquí es señalar que HashMap almacena objetos clave y objetos de valor en el balde como map.entry. Esto ayuda a comprender la lógica de obtener objetos. Si no se da cuenta de esto, o cree erróneamente que solo almacena valores en cubos, no responderá a la lógica de cómo obtener objetos de HashMap. Esta respuesta es bastante correcta, y también muestra que el entrevistador conoce el hashing y cómo funciona Hashmap. Pero esto es solo el comienzo de la historia. Cuando el entrevistador se une a algunas escenas reales que los programadores de Java tienen que encontrar todos los días, las respuestas incorrectas aparecen con frecuencia. La siguiente pregunta puede ser sobre la detección de colisiones en Hashmap y la solución a la colisión:
"¿Qué sucede cuando el cloque de dos objetos es el mismo?" A partir de aquí, comienza la verdadera confusión, y algunos entrevistadores responderán que, debido a que el ChoCode es el mismo, los dos objetos son iguales y el hashmap arrojará excepciones, o no serán almacenados. Luego, el entrevistador puede recordarles que hay dos métodos: igual () y hashcode (), y decirles que incluso si el cónimo es el mismo, puede no ser igual. Algunos entrevistadores pueden rendirse, mientras que otros pueden continuar avanzando. Respondieron: "Debido a que el hashcode es el mismo, su posición de cubo es la misma, y la" colisión "sucederá. Debido a que hashmap usa una lista vinculada para almacenar objetos, esta entrada (el objeto map.entry que contiene pares de valores clave) se almacenará en la lista vinculada". Esta respuesta es muy razonable. Aunque hay muchas formas de tratar con colisiones, este método es el más fácil y es el método de procesamiento de HASHMAP. Pero la historia aún no ha terminado, y el entrevistador continuará preguntando:
"Si el CODEDE de las dos claves es la misma, ¿cómo se obtiene el objeto de valor?" El entrevistador responderá: cuando llamemos al método get (), hashmap usará el cho de hash del objeto clave para encontrar la ubicación del cubo y luego obtener el objeto de valor. El entrevistador le recuerda que si se almacenan dos objetos de valor en el mismo balde, da la respuesta: la lista vinculada se atravesará hasta que se encuentre el objeto de valor. El entrevistador preguntará, porque no tiene un objeto de valor para comparar, ¿cómo determinó si encontrar el objeto de valor? A menos que el entrevistador almacene pares de valor clave en la lista vinculada hasta que hashmap los almacene en la lista vinculada, no podrán responder a esta pregunta.
Algunos de los entrevistadores que recuerdan este importante punto de conocimiento dirán que después de encontrar la ubicación del cubo, llamarán al método Keys.equals () para encontrar el nodo correcto en la lista vinculada y finalmente encontrar el objeto de valor que se encuentra. ¡La respuesta perfecta!
En muchos casos, los entrevistadores cometerán errores en este enlace porque confunden los métodos hashcode () e igual (). Porque antes de este hashcode () aparece repetidamente, y el método igual () solo aparece al obtener el objeto de valor. Algunos desarrolladores excelentes señalarán que el uso de objetos inmutables y declarados como finales y el uso de métodos apropiados iguales () y hashcode () reducirá la aparición de colisiones y mejorará la eficiencia. La inmutabilidad permite que el hashcode de diferentes claves sea almacenado en caché, lo que aumentará la velocidad de obtener todo el objeto. Usar clases de envoltura como String and Interger como teclas es una muy buena opción.
Si crees que está aquí, te sorprenderá cuando escuches la siguiente pregunta. "¿Qué pasa si el tamaño de Hashmap excede la capacidad definida por el factor de carga?" A menos que realmente sepa cómo funciona Hashmap, no responderá esta pregunta. El tamaño del factor de carga predeterminado es 0.75. Es decir, cuando un mapa llena un 75% de cubos, como otras clases de recolección (como ArrayList, etc.), se creará una matriz de cubos que es dos veces el tamaño del hashmap original para cambiar el tamaño del mapa y colocar el objeto original en la nueva matriz de cubos. Este proceso se llama rehacer porque llama al método hash para encontrar la nueva ubicación del cubo.
Si puede responder a esta pregunta, viene la siguiente pregunta: "¿Entiende qué problemas hay para cambiar el tamaño de hashmap?" Es posible que no pueda responderlo. En este momento, el entrevistador le recordará que cuando múltiples subconjuntos, puede haber una condición de carrera.
Al cambiar el tamaño de HASHMAP, de hecho existe una competencia condicional, porque si ambos hilos encuentran que Hashmap necesita cambiar el tamaño, intentarán cambiar el tamaño al mismo tiempo. Durante el proceso de cambio de tamaño, el orden de los elementos almacenados en la lista vinculada se revertirá, porque cuando se mueve a la nueva posición del cubo, HashMap no coloca los elementos al final de la lista vinculada, sino en la cabeza, que es evitar el recorrido de la cola. Si se produce una competencia condicional, entonces hay un círculo vicioso. En este momento, puede preguntarle al entrevistador por qué es tan extraño que necesita usar HashMap en un entorno multiproceso. :)
Los lectores entusiastas contribuyen con más preguntas sobre el hashmap:
1. ¿Por qué las clases de envoltura son como String and Interger adecuadas como teclas? La clase de envoltura como String e Interger es la más adecuada como clave hashmap, y la cadena es la más utilizada. Porque la cadena es inmutable y final, y los métodos iguales () y hashcode () se han reescrito. Otras clases de envoltura también tienen esta característica. La inmutabilidad es necesaria porque para calcular hashcode (), debe evitar que el valor clave cambie. Si el valor clave devuelve un CCODE diferente al poner y obtener, no puede encontrar el objeto que desea del hashmap. La inmutabilidad tiene otras ventajas, como la seguridad de los subprocesos. Si puede garantizar que el hashcode no cambie solo al declarar un campo como final, entonces hágalo. Debido a que los métodos iguales () y hashcode () se utilizan al obtener objetos, es muy importante reescribir estos dos métodos correctamente. Si dos objetos desiguales devuelven diferentes hashcodes, la posibilidad de colisión será menor, lo que puede mejorar el rendimiento de HASHMAP.
2. ¿Podemos usar objetos personalizados como claves? Esta es una extensión de la pregunta anterior. Por supuesto, puede usar cualquier objeto como teclas siempre que siga las reglas de definición de los métodos iguales () y hashcode () y no cambiará nuevamente después de que el objeto se inserta en el mapa. Si este objeto personalizado es inmutable, entonces ya satisface la condición como una clave porque no se puede cambiar después de que se crea.
3. ¿Podemos usar Cocurrenthashmap para reemplazar el hashtable? Esta es otra pregunta de entrevista muy popular, porque cada vez más personas usan concurrenthashmap. Sabemos que la hashtable está sincronizada, pero la sincronización de concurrencia de mapas es mejor porque bloquea una parte del mapa basado en el nivel de sincronización. Concurrenthashmap ciertamente puede reemplazar a hashtable, pero la hashtable proporciona una seguridad de hilos más fuerte. Echa un vistazo a este blog para ver la diferencia entre hashtable y concurrenthashmap.
Personalmente, me gusta mucho esta pregunta porque la profundidad y amplitud de esta pregunta no involucran directamente diferentes conceptos. Echemos un vistazo a qué puntos de conocimiento son sobre el diseño de estas preguntas:
Resumir
Cómo funciona el hashmap
Hashmap se basa en el principio de hash, y almacenamos y obtenemos objetos a través de los métodos Put () y Get (). Cuando pasamos el par de valores clave al método Put (), llama al método hashcode () del objeto clave para calcular el húsico, y luego encuentra la posición del cubo para almacenar el objeto de valor. Al obtener el objeto, el par de valor clave correcto se encuentra a través del método igual () del objeto clave, y luego se devuelve el objeto de valor. HashMap utiliza listas vinculadas para resolver el problema de colisión. Cuando ocurre una colisión, el objeto se almacenará en el siguiente nodo de la lista vinculada. Hashmap almacena objetos de par de valores clave en cada nodo de lista vinculada.
¿Qué sucede cuando el Código hash de dos objetos clave diferentes es el mismo? Se almacenarán en la lista vinculada en la misma ubicación de cubo. El método igual () del objeto clave se usa para encontrar pares de valor clave.
Debido a que hashmap tiene muchos beneficios, utilicé hashmap como caché en aplicaciones de comercio electrónico. Debido a que Java se usa mucho en el campo financiero, y para las consideraciones de rendimiento, a menudo usamos HashMap y concurrenthashmap. Puede ver más artículos sobre el hashmap:
La diferencia entre hashmap y hashtable
La diferencia entre hashmap y hashset
Enlace original: Javarevisited Traducción: importnew.com - Tang Xiaojuan Enlace de traducción: http://www.importnew.com/7099.html