Solicite una oferta a una gran fábrica: mapa de preguntas de la entrevista

Prefacio

El texto se ha incluido en mi GitHub : https://github.com/ZhongFuCheng3y/3y , hay más de 300 artículos originales, ¡y la serie de entrevistas se está serializando recientemente !

Yo, Sanwai, recientemente comencé a escribir una serie de entrevistas. Le di a esta serie de entrevistas un nombre llamado " Solicite una oferta a una gran fábrica ".

Por eso, este artículo se llama " Solicite una oferta a una gran empresa: mapa de preguntas de la entrevista "

Empecemos a continuación.

Sitio de entrevistas

Sanwai : "Mi nombre es Sanwai . Actualmente mantengo una cuenta pública llamada Java3y . En los últimos años, he escrito más de 300 artículos técnicos originales, casi 1000 páginas de libros electrónicos originales y mapas mentales con múltiples puntos de conocimiento. Mi visión es: Siempre que me presten atención y los terceros compañeros de clase consecutivos puedan obtener la oferta de Dachang . Mi ... "

Tres ladrones: "Map es una interfaz en Java, y las clases de implementación comunes son HashMap, LinkedHashMap, TreeMap y ConcurrentHashMap"

Tres ladrones: "Lo primero que hay que tener claro es: en Java, la estructura de 数组+链表la tabla hash es el camino. La estructura de datos subyacente de HashMap es 数组+链表/红黑树, la estructura de datos subyacente de LinkedHashMap es , la estructura de datos subyacente de 数组+链表+双向链表TreeMap es un árbol rojo-negro, y la estructura de datos subyacente de ConcurrentHashMap también es 数组+链表/红黑树"

Entrevistador: "Empecemos con HashMap primero. ¿Puedes hablar sobre lo que sucede cuando tienes newun HashMap?"

Tres torcidos: "HashMap tiene varios métodos de construcción, pero lo más importante es especificar el tamaño del valor inicial y el tamaño del factor de carga. Si no lo especificamos, el tamaño predeterminado de HashMap es 16, y el tamaño del factor de carga es 0.75"

Tres torcidos: "El tamaño del HashMap solo puede ser una potencia de 2. Si pasas un 10 pulgadas, de hecho, el tamaño final del HashMap es 16, pasas un 7 pulgadas y el tamaño final del HashMap es 8. tableSizeForPuedes ver la implementación específica Para. Cuando colocamos el elemento en el HashMap, necesitamos calcular la ubicación (hash) del elemento. En el HashMap, se usa la operación de bits en lugar del módulo, que puede calcular la ubicación del elemento de manera más eficiente . Por qué el tamaño del HashMap Solo puede ser una potencia de 2, porque solo cuando la magnitud es una potencia de 2, podemos usar razonablemente operaciones de bits en lugar de módulo ".

Tres ladrones: "El tamaño del factor de carga determina la expansión de la tabla hash y el conflicto hash . Por ejemplo, mi tamaño predeterminado de HashMap es 16 y el factor de carga es 0,75, lo que significa que la matriz solo puede contener 12 elementos como máximo. Si hay 12 elementos, la tabla hash debe expandirse. ¿Cómo calcular que sea 12? Es muy simple 16*0.75. Cada vez putque ingrese un elemento, verificará si el tamaño del HashMap excede este umbral. Si es así, debe expandirse ".

Tres torcidos: "En vista de la declaración anterior (el tamaño del HashMap solo puede ser una potencia de 2), el valor predeterminado es expandir el original 2 veces al expandir la capacidad".

Tres sesgos: "Obviamente, la operación de expansión debe llevar mucho tiempo, luego puedo aumentar un poco el factor de carga , por ejemplo, si quiero ajustarlo a 1, entonces mi HashMap solo se expandirá cuando haya 16 elementos. Obviamente es Sí, pero no recomendado. Se ha aumentado el factor de carga, lo que significa que la probabilidad de colisiones hash aumentará y la probabilidad de colisiones hash aumentará, lo que también llevará mucho tiempo (porque la velocidad de búsqueda es más lenta) "

Tres torcidos: "La realización se basa en el hashmétodo. Lo que se puede encontrar es que primero calcula el valor hash normal y luego realiza una operación OR exclusiva con los 16 bits altos para generar el valor hash final. La ventaja de esto puede aumentar la aleatoriedad. Sexo , reduciendo la posibilidad de colisión ".

Tres ladrones: "En putese momento, primero realice una operación hash en la clave para calcular el índice donde se encuentra la clave. Si no hay colisión, colóquela directamente en la matriz. Si hay una colisión, debe determinar si la estructura de datos actual es una lista vinculada o un árbol rojo-negro. Insertar en diferentes situaciones. Suponiendo que la clave es la misma, reemplazar con el valor original. Finalmente, juzgue si la tabla hash está llena (el *factor de carga actual del tamaño de la tabla hash ), si está llena, expanda la capacidad.

Tres ladrones: "En getese momento, todavía realizo una operación hash en la clave, calculo el índice donde se encuentra la clave y luego determino si hay un conflicto hash, si no hay un retorno directo, si lo hay, luego determine si la estructura de datos actual es una lista vinculada o un árbol rojo-negro, respectivamente Sáquelo de una estructura de datos diferente ".

Tres ladrones: "Primero, se compara el valor hash y luego el ==operador y se equals()utiliza para determinar si el elemento es el mismo. Para decirlo sin rodeos: si solo el valor hash es el mismo, significa que el elemento tiene un conflicto hash. Si el valor hash y equals() || ==son iguales, entonces Explique que el elemento es el mismo ".

Tres desviaciones: "Cuando el tamaño de la matriz es mayor que 64 y el tamaño de la lista vinculada es mayor que 8 , la lista vinculada se cambiará a un árbol rojo-negro. Cuando el tamaño del árbol rojo-negro es 6 , degenerará en una lista vinculada. Aquí, el árbol rojo-negro degenerará en una lista vinculada. La operación se basa principalmente en consideraciones de rendimiento durante la consulta y la inserción . La complejidad del tiempo de consulta de la lista vinculada es O (N), la complejidad del tiempo de inserción O (1), la consulta del árbol rojo-negro y la complejidad del tiempo de inserción O (logN) "

Tres torcidos: "De hecho, LinkedHashMap no se usa mucho en el desarrollo diario. Como se mencionó anteriormente, la estructura subyacente de LinkedHashMap sí 数组+链表+双向链表". De hecho, hereda HashMap y mantiene una lista doblemente vinculada sobre la base de HashMap . Con esta lista doblemente enlazada, nuestras inserciones se pueden "ordenar" El orden aquí no se refiere al orden de tamaño, sino al orden de inserción .

Tres torcidos: "LinkedHashMap en realidad usa una lista doblemente enlazada al atravesar, por lo que el tamaño de LinkedHashMap no afectará el rendimiento del cruce"

Tres ladrones: "TreeMap no se usa mucho en el desarrollo real. La estructura de datos subyacente de TreeMap es un árbol rojo-negro. La clave de TreeMap no puede ser nula (si es nula, ¿cómo clasificarla?), TreeMap se ordena mediante Comparator A modo de comparación, si el comparador es nulo, se utiliza el orden natural "

Tres ladrones: "HashMap no es seguro para subprocesos. En un entorno de subprocesos múltiples, HashMap puede tener pérdida de datos y no puede obtener los datos más recientes. Por ejemplo, el subproceso A putentra pero el subproceso B getno puede salir. Queremos seguridad para subprocesos. Puede utilizar ConcurrentHashMap "

Tres ladrones: "ConcurrentHashMap es una clase de implementación de mapas segura para subprocesos, que se encuentra debajo del jucpaquete. Además de ConcurrentHashMap, hay otra clase de implementación de mapas segura para subprocesos llamada Hashtable. Por supuesto, las colecciones también se pueden usar para empaquetar un mapa seguro para subprocesos. Pero Los paquetes Hashtable y Collections son relativamente ineficientes (porque la sincronización se establece directamente en la capa exterior), por lo que generalmente tenemos consideraciones de seguridad de subprocesos y usamos ConcurrentHashMap "

Tres ladrones: "La estructura de datos subyacente de ConcurrentHashMap es 数组+链表/红黑树que puede admitir un alto acceso y actualización simultáneos, y es seguro para subprocesos. ConcurrentHashMap logra la sincronización bloqueando partes y utilizando el algoritmo CAS . No gethay bloqueo en ese momento, y Node lo usa. Para volatiledecorar. Al expandirse, a cada hilo se le asignará un intervalo correspondiente , y para evitar putValinconsistencias de datos, el intervalo del hilo se bloqueará ".

Tres torcidos: "No, no lo haré"

Tres torcidos: "También vi JDK7 HashMap y ConcurrentHashMap cuando estaba estudiando. De hecho, todavía hay muchas diferencias. Por ejemplo, el HashMap de JDK 7 usa el método de interpolación de cabeza cuando se expande, pero se convierte en el método de interpolación de cola en JDK8. HashMap en JDK7 aún no ha introducido árboles rojo-negro ... ConcurrentHashMap todavía se implementa en JDK7 usando bloqueos segmentados, pero JDK 8 es diferente. Pero la mayoría de los detalles de JDK 7 se han olvidado ".

Tres torcido: "No he utilizado la API del JDK 7, pensé que debería utilizar JDK8 al menos ahora, bien Así que no he leído con cuidado?. ¿Qué te dije de múltiples hilos? "

Tres torcidos: "Oh"

Digresión

Para esta entrevista, es posible que desee saber más sobre los detalles de Map, como Map基础知识/HashMap/LinkedHashMap/TreeMap/ConcurrentHashMapel código fuente, ¡puede consultar mis artículos anteriores sobre CSDN !

Bienvenido a Me gusta, ¡esta es mi motivación para actualizar!

Supongo que te gusta

Origin blog.csdn.net/Java_3y/article/details/108253021
Recomendado
Clasificación