Resumen de las preguntas de la entrevista de la fuente del mapa

Resumen de las preguntas de la entrevista de la fuente del mapa

Map ocupa gran parte de las preguntas de la entrevista, de las cuales HashMap es la principal, algunas de estas preguntas se pueden explicar con claridad y otras son difíciles de explicar.

Uno: mapear problemas generales de estructura de datos

1.1: Hablar sobre la estructura de datos subyacente de HashMap

Respuesta: La capa inferior de HashMap es la estructura de datos de la matriz + lista vinculada + árbol rojo-negro. La función principal de la matriz es facilitar la búsqueda rápida. La complejidad de tiempo es O (1), el tamaño predeterminado es 16 y el índice de subíndice de la matriz se calcula mediante el código hash de la clave. El elemento de la matriz se llama Nodo. ​​Cuando los códigos hash de varias claves son iguales, pero los valores de las claves son diferentes, un solo nodo se convertirá en una lista vinculada. La complejidad de la consulta de la lista vinculada es O (n). Cuando la longitud de la lista vinculada es mayor o igual a 8 y la matriz Cuando el tamaño de es mayor que 64, la lista vinculada se transformará en un árbol rojo-negro. La complejidad de la consulta del árbol rojo-negro es O (log (n)). En pocas palabras, el peor número de consultas equivale a la profundidad máxima del árbol rojo-negro.

1.2: ¿Cuáles son las similitudes y diferencias entre HashMap, TreeMap y LinkedHashMap?

Respuesta: El mismo punto:

  1. Los tres usarán árboles rojo-negros bajo ciertas circunstancias;
  2. Durante la iteración, si se cambia la estructura de datos del mapa, se informará ConcurrentModificationException;

diferencia:

  1. La estructura de datos de ashMap es principalmente una matriz, y la consulta es muy rápida. La estructura de datos de TreeMap es principalmente un árbol rojo-negro. Aprovecha las características del árbol rojo-negro que es pequeño a la izquierda y grande a la derecha para realizar la clasificación de claves. LinkedHashMap agrega una lista enlazada basada en HashMap. La estructura realiza dos estrategias de acceso a la secuencia de inserción y eliminación de acceso mínimo;
  2. Debido a las diferencias en la estructura de datos subyacente de los tres mapas, los escenarios de uso de los tres son diferentes. TreeMap es adecuado para escenarios que necesitan ser ordenados por clave, LinkedHashMap es adecuado para el acceso en el orden de inserción, o escenarios que necesitan eliminar los elementos menos accesibles. Usamos los escenarios restantes. HashMap es suficiente, la mayoría de los escenarios en nuestro trabajo básicamente usan HashMap;
  3. Debido a la diferencia en la estructura de datos subyacente de los tres mapas, la API del paquete superior es ligeramente diferente;
  4. HashMap es el mismo que el algoritmo hash subyacente de LinkedHashMap, TreeMap no tiene algoritmo hash;

Dos: detalles del código fuente de HashMap

2.1: ¿Cómo se expande HashMap?

Respuesta: Cuándo expandir:

  1. Cuando se coloca, la matriz se encuentra vacía y se lleva a cabo la expansión inicial. El tamaño de expansión predeterminado es 16;
  2. Después de que la colocación es exitosa, cuando se encuentra que el tamaño de la matriz existente es mayor que el umbral de expansión, se realiza la expansión y la expansión es el doble del tamaño de la matriz anterior;

El umbral para la expansión es el umbral. El umbral se recalculará cada vez que se expanda. El umbral es igual al tamaño de la matriz * factor de impacto (0,75).

2.2: ¿Qué hacer cuando el hash entra en conflicto?

Respuesta: El conflicto de hash se refiere a la situación en la que el cálculo del código hash del valor clave es el mismo, pero el valor clave es diferente.

Si solo hay un elemento en el depósito o ya es una lista vinculada, el nuevo elemento se agrega directamente al final de la lista vinculada;

Si los elementos del depósito ya son listas vinculadas y el número de listas vinculadas es mayor o igual a 8, hay dos situaciones en este momento:

  1. Si el tamaño de la matriz es menor que 64 en este momento, y la matriz se expande nuevamente, la lista vinculada no se convertirá en un árbol rojo-negro;
  2. Si el tamaño de la matriz es superior a 64, la lista enlazada se convertirá en un árbol rojo-negro;

Aquí no solo se considera que el número de listas vinculadas es mayor o igual a 8, sino que también se juzga el tamaño de la matriz. La capacidad de la matriz es menor que 64. No hay conversión inmediata. Se supone que el árbol rojo-negro ocupa mucho más espacio que la lista vinculada, y la conversión también requiere mucho tiempo, por lo que la matriz Cuando la capacidad es pequeña, el conflicto es serio. Podemos intentar expandir la capacidad primero para ver si podemos resolver el problema del conflicto expandiendo la capacidad.

2.2: ¿Por qué la lista enlazada debería transformarse en un árbol rojo-negro cuando el número de listas enlazadas es mayor o igual a 8?

Respuesta: Cuando hay demasiadas listas vinculadas, el recorrido puede llevar mucho tiempo. La conversión a un árbol rojo-negro puede reducir la complejidad de tiempo del recorrido, pero la conversión a un árbol rojo-negro requiere espacio y un costo de conversión que requiere mucho tiempo. Según el cálculo de la fórmula de distribución suelta, en circunstancias normales, el concepto de 8 en el número de listas vinculadas es menos de uno en diez millones, por lo que en condiciones normales, las listas vinculadas no se convertirán en árboles rojo-negro. El propósito de este diseño es prevenir anomalías. En circunstancias, por ejemplo, cuando hay un problema con el algoritmo hash y el número de listas enlazadas es fácilmente mayor o igual a 8, aún se puede recorrer rápidamente.

Pregunta ampliada: ¿Cuándo se convertirá el árbol rojo-negro en una lista vinculada?

Respuesta: Cuando el número de nodos es menor o igual a 6, el árbol rojo-negro se convertirá automáticamente en una lista vinculada. La consideración principal es el costo de espacio del árbol rojo-negro. Cuando el número de nodos es menor o igual a 6, atravesar la lista vinculada también es rápido, por lo que rojo-negro El árbol volverá a convertirse en una lista vinculada.

2.2: Cuando se coloca HashMap, ¿qué pasa si la clave ya existe en la matriz y no quiero sobrescribir el valor? ¿Qué debo hacer si quiero volver al valor predeterminado cuando el valor obtenido está vacío?

Respuesta: Si la matriz tiene una clave, pero no desea sobrescribir el valor, puede elegir el método putIfAbsent. Este método tiene una variable incorporada onlyIfAbsent. Si la variable incorporada es verdadera, no se sobrescribirá. El método de colocación que usamos normalmente, el método integrado onlyIfAbsent es falso, lo que permite sobrescribir de.

Al tomar el valor, si está vacío y desea volver al valor predeterminado, puede utilizar el método getOrDefault. El primer parámetro del método es clave y el segundo parámetro es el valor predeterminado que desea devolver, como map.getOrDefault ("2", "0") , Cuando no hay un valor de clave 2 en el mapa, devolverá 0 por defecto en lugar de vacío.

Tres: Otras preguntas de la entrevista de Map

3.1: Cuando se utiliza DTO como clave de Map, ¿hay algún punto que necesite atención?

Respuesta: DTO es un soporte de datos, que puede considerarse como una clase Java con muchos atributos. Podemos realizar operaciones de obtención y configuración en estos atributos.

Vea qué tipo de mapa, si es un HashMap, debe anular los métodos equals y hashCode, porque cuando get y put, necesita usar el método equals para determinar la igualdad; si es un TreeMap, DTO necesita implementar la interfaz Comparable, porque TreeMap utilizará la interfaz Comparable para determinar el tamaño de la clave; si es LinkedHashMap, es lo mismo que HashMap.

3.2: ¿Cuál es el significado de LRU en LinkedHashMap y cómo se implementa?

Respuesta: LRU, nombre completo en inglés: el menos usado recientemente, el chino llamado Menos usado recientemente, en LinkedHashMap, también se llama Estrategia de eliminación de menos acceso. Podemos establecer una cierta estrategia a través del método removeEldestEntry para crear el elemento menos visitado en el momento adecuado El principio es que al final de la ejecución del método put, LinkedHashMap verificará esta estrategia y, si cumple con la estrategia, eliminará el nodo principal.

El principio de asegurar que el nodo principal es el elemento menos visitado es: cuando el LinkedHashMap se pone, moverá el nodo actualmente visitado al final de la lista enlazada. Lentamente, el nodo principal será el elemento menos visitado.

3.3: ¿Por qué se recomienda que todos los elementos de TreeMap implementen una interfaz comparable? Pero cuando la clave es String, ¿no tenemos ningún trabajo extra?

Respuesta: Debido a que la capa inferior de TreeMap es comparar el tamaño de dos claves clasificándolas, se recomienda que las claves implementen la interfaz Comparable para desarrollar el orden de clasificación que desee, y String ha implementado la interfaz Comparable, por lo que al usar String, No necesitamos trabajo adicional, no solo String, otros tipos de empaque también implementan la interfaz Comparable, como Long, Double, Short, etc.

Cuatro: Resumen

Las preguntas de la entrevista de Map son principalmente HashMap, y preguntarán muchas cosas del código fuente. TreeMap y LinkedHashMap se centran principalmente en funciones y escenarios, como elementos adicionales.
Hay muchos tipos de preguntas de la entrevista de Map, pero siempre que comprenda los principios, no importa cuántas preguntas cambie, la respuesta será más fácil.

Supongo que te gusta

Origin blog.csdn.net/weixin_38478780/article/details/107927282
Recomendado
Clasificación