¿Ha dominado las características y los principios subyacentes de HashMap que las grandes fábricas y las grandes vacas han dominado?

Prefacio

HashMap almacena pares clave-valor para un acceso rápido y permite nulos. El valor de la clave no se puede repetir. Si se repite, se sobrescribirá. Este artículo compartirá contigo las preguntas de la entrevista de HashMap. Es muy bueno y tiene un cierto valor de referencia. Los amigos que lo necesiten pueden consultar
las características de HashMap.

  • HashMap almacena pares clave-valor para un acceso rápido y permite nulos. El valor de la clave no se puede repetir. Si se repite, se sobrescribirá.
  • .Asincrónico, subproceso inseguro.
  • La capa inferior es una tabla hash, que no garantiza el orden (como el orden de inserción)

Tema

1. ¿Cuál es el principio subyacente de HashMap?

HashMap se basa en el principio de hash. Después de jdk8, se adopta la estructura de datos de matriz + lista enlazada + árbol rojo-negro. Almacenamos y obtenemos objetos a través de put y get. Cuando pasamos la clave y el valor al método put (), primero hagamos un cálculo hashCode () en la clave para ingresar

La ubicación en la matriz de cubos para almacenar objetos Entry. Cuando obtenga el objeto, obtenga la ubicación del depósito a través de get, luego busque el par clave-valor correcto mediante el método equals () del objeto clave y luego devuelva el objeto de valor.

2. ¿Cómo se implementa put en hashMap?

  • Calcule el valor del código hash de la clave (operación exclusiva o con los 16 bits altos de Key.hashCode)
  • Si la tabla hash está vacía, llame a resize () para inicializar la tabla hash
  • Si no hay colisión, agregue el elemento directamente a la tabla hash
  • Si ocurre una colisión (el valor de hashCode es el mismo), se hacen tres juicios:

1. Si la dirección de clave es la misma o el contenido después de igual es el mismo, reemplace el valor anterior. Si es una estructura de árbol rojo-negro, llame al método de inserción de árbol
2. Estructura de lista vinculada, repita hasta que un nodo en la lista vinculada esté vacío, inserte el método de inserción de cola , Después de insertar, juzgue si el número de listas enlazadas alcanza el umbral de 8 para convertirse en un árbol rojo-negro;
3. También es posible recorrer hasta que el valor hash y el contenido del elemento insertado sean los mismos que los del nodo, y cubrirlo.

  • Si el depósito está lleno por encima del umbral, cambie el tamaño para expandirlo

3. ¿Cómo se implementa en hashMap?

Aplique hash en el hashCode de la clave y calcule el subíndice para obtener la posición del depósito. Si se puede encontrar en la primera posición del depósito, devuélvalo directamente. De lo contrario, búsquelo en el árbol o recorra la lista vinculada. Si hay un conflicto de hash, utilice el método equals para ir. Recorra la lista vinculada para encontrar nodos.

4. ¿Qué sucede cuando los códigos hash de dos objetos son iguales?

Se producirá una colisión de hash. Si el valor de la clave es el mismo, reemplace el valor anterior. De lo contrario, se vinculará a la parte posterior de la lista vinculada, y la lista vinculada se almacenará en un árbol rojo-negro si la longitud de la lista vinculada excede el umbral 8. El HashCode es el mismo y el objeto de valor se obtiene comparando el contenido a través de iguales.

5. La diferencia entre HashMap y HashTable

  • El mismo punto: todos almacenan pares clave-valor clave-valor
  • Diferencias:
    HashMap permite que el valor clave sea nulo, mientras que hashTable no;
    hashMap no considera la sincronización, que no es segura para los subprocesos. HashTable es seguro para subprocesos y agrega una capa de decoración sincronizada a la api;
    HashMap hereda de la clase AbstractMap y hashTable hereda de la clase Dictionary. Iterador. El iterador de HashMap es un iterador a prueba de fallas, mientras que el iterador enumerador de Hashtable no es un iterador a prueba de fallas. Entonces, cuando otros subprocesos cambien la estructura de HashMap (agregar o eliminar elementos), se lanzará ConcurrentModificationException. El valor inicial de la capacidad y el método de aumento son diferentes: la capacidad predeterminada de HashMap es 16; al aumentar la capacidad, la capacidad se cambia a "capacidad original x2" cada vez. La capacidad predeterminada de Hashtable es 11; al aumentar la capacidad, cada vez que la capacidad se cambia a "capacidad original x2
    • 1 "; El algoritmo de valor hash cuando se agrega un valor clave es diferente: cuando se agregan elementos a HashMap, se usa un algoritmo hash personalizado. Hashtable no tiene un algoritmo hash personalizado, pero usa directamente el hashCode () de la clave.

6. ¿Qué es HashSet?

HashSet implementa la interfaz Set, que no permite valores duplicados en la colección. Cuando mencionamos HashSet, lo primero es asegurarse de que el objeto reescribe los métodos equals () y hashCode () antes de almacenar el objeto en el HashSet , De modo que podamos comparar si los valores de los objetos son iguales para garantizar que no se almacenen objetos iguales en el conjunto. Si no anulamos estos dos métodos, se utilizará la implementación predeterminada de este método. El método public boolean add (Object o) se utiliza para agregar elementos al conjunto. Cuando el valor del elemento se repite, inmediatamente devolverá falso y, si se agrega correctamente, devolverá verdadero.

7. ¿La diferencia entre HashSet y HashMap?

Inserte la descripción de la imagen aquí

8. Desventajas del hashMap tradicional (¿por qué introducir árboles rojo-negro?

Antes de JDK 1.8, la implementación de HashMap era una matriz + lista enlazada Incluso si la función hash es buena, es difícil lograr una distribución 100% uniforme de los elementos. Cuando una gran cantidad de elementos en el HashMap se almacenan en el mismo depósito, hay una larga lista enlazada debajo de este depósito. En este momento, el HashMap es equivalente a una lista enlazada individualmente. Si la lista enlazada individualmente tiene n elementos, la complejidad temporal del recorrido es O (n), perdió por completo sus ventajas. En respuesta a esta situación, JDK 1.8 introdujo un árbol rojo-negro (la complejidad del tiempo de búsqueda es O (logn)) para optimizar este problema

9. ¿Qué tipo de elemento se usa generalmente como clave cuando se usa HashMap?

Elija Integer, String, este tipo inmutable, como todas las operaciones en String están creando un objeto String, empalmando y dividiendo el nuevo objeto, etc. Estas clases ya han estandarizado los métodos hashCode () y equals (). . Ser una clase inmutable es inherentemente seguro para subprocesos,

10. ¿Qué pasa si el tamaño del HashMap excede la capacidad definida por el factor de carga?

Superar el valor de umbral se expandirá. En general, la matriz expandida será el doble del tamaño de la matriz original. Re-hash de los elementos originales en la nueva tabla hash.

para resumir

HashMap es un punto de conocimiento que los entrevistadores deben preguntar. Todos los entrevistadores deben dominar sus principios de implementación básicos internos. Solo cuando realmente domine los principios de implementación interna de HashMap, no tendrá prisa frente a la tortura de los entrevistadores. .
Es el período de reclutamiento de oro de 9 y 10 de oro, ¿están todos listos? Recopilé las preguntas de la entrevista de algunos de los principales fabricantes y la información más reciente de este año (2020). A continuación, se muestran algunas capturas de pantalla de la información (toda la información se ha integrado en un documento, y el pdf está comprimido y empaquetado).
Si necesita toda la información más reciente sobre las preguntas de la entrevista JAVA y 2020, puede hacer clic aquí para obtener el código: qf
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/SpringBoot_/article/details/108671960
Recomendado
Clasificación