El principio de HashMap explicación detallada de las preguntas avanzadas de la entrevista de los fabricantes de Android

texto

Hable sobre el principio de HashMap, el proceso de acceso, por qué se usa el árbol rojo-negro, la comparación entre el árbol rojo-negro y el árbol binario completo, HashTab, concurrentHashMap, ¿qué hay en el paquete concurrente?

¿Qué está tratando de investigar esta pregunta?

1. ¿Principio básico de HashMap, HashTab?

2. ¿Cuáles son las ventajas de ConcurrentHashMap sobre HashMap?

3. ¿Qué tipo de funciones hay en el paquete Concurrente?

Puntos de conocimiento de inspección

HashMap, HashTab, ConcurrentHashMap

Cómo responden los candidatos
El principio de HashMap

HashMap utiliza internamente una matriz con una capacidad predeterminada de 16 para almacenar datos, y cada elemento de la matriz es el nodo principal de una lista vinculada, por lo que, más precisamente, la estructura de almacenamiento interno de HashMap utiliza una estructura de cremallera de tabla hash (matriz + lista enlazada).

inserte la descripción de la imagen aquí

El tamaño de almacenamiento predeterminado en HashMap es una matriz con una capacidad de 16, por lo que cuando creamos un objeto HashMap, incluso si no contiene elementos, debemos asignarle un espacio de memoria y continuamos poniendo datos en el HashMap, cuando se alcanza un cierto límite de capacidad, HashMap se expandirá automáticamente.

El principio de HashTab

La tabla hash (tabla hash, también llamada tabla hash) es una estructura de datos a la que se accede directamente según el valor de la clave (valor de la clave). Es decir, accede a los registros asignando valores clave a una ubicación en la tabla para acelerar las búsquedas. Esta función de mapeo se llama función hash, y la matriz que almacena los registros se llama tabla hash.

La tabla hash de la tabla hash (clave, valor) consiste en convertir la clave en un número entero a través de una función de algoritmo fijo, la llamada función hash, y luego llevar el resto del número a la longitud de la matriz, y el resultado del resto se considera el subíndice de la matriz, almacene el valor en el espacio de la matriz subíndice de este número. Al usar la tabla hash para consultar, la clave se convierte en el subíndice de matriz correspondiente usando la función hash nuevamente, y el espacio se ubica para obtener el valor. De esta manera, el rendimiento de posicionamiento de la matriz se puede utilizar por completo para el procesamiento de datos. posición

Hay varias formas de usarlo:

  • Hashtable es una tabla hash que almacena asignaciones de pares clave-valor (clave-valor).
  • Hashtable hereda de Dictionary e implementa las interfaces Map, Cloneable y java.io.Serializable.
  • Las funciones de Hashtable están todas sincronizadas, lo que significa que es seguro para subprocesos. Su clave y valor no pueden ser nulos.
¿Por qué HashMap usa un árbol rojo-negro? ¿Cuáles son las ventajas de un árbol rojo-negro sobre un árbol binario completo?

Echemos un vistazo a las principales características de los árboles rojo-negro:

  • Un árbol de búsqueda binario equilibrado con un atributo de color (rojo o negro) para cada nodo.
  • Los nodos son rojos o negros.
  • El nodo raíz es negro.
  • Todos los nodos de hoja son negros.
  • Cada nodo rojo debe tener dos hijos negros (no hay dos nodos rojos consecutivos en todos los caminos desde cada hoja hasta la raíz).
  • Todos los caminos simples desde cualquier nodo hasta cada una de sus hojas contienen el mismo número de nodos negros.

árbol binario completo

Si el árbol binario, excepto la última capa de nodos, es un árbol binario completo, y los nodos de la última capa se distribuyen de izquierda a derecha, entonces este árbol binario se denomina árbol binario completo.
inserte la descripción de la imagen aquí

El árbol rojo-negro es una especie de árbol binario equilibrado, que sigue la ley de "izquierda y derecha" del árbol binario cuando se inserta.

El nodo secundario izquierdo del nodo principal: es más pequeño que el valor del nodo principal y el valor más cercano al nodo principal en el subárbol.

El nodo secundario derecho del nodo principal: es mayor que el valor del nodo principal y el valor más cercano al nodo principal en el subárbol.

Qué hay dentro del paquete concurrente

**ConcorrenctHashMap: ** Divide los datos en secciones y guárdalos uno por uno, y asigna un bloqueo a cada sección de datos. Cuando un subproceso ocupa un bloqueo para acceder a una sección de datos, también se puede acceder a otras secciones de datos mediante otros subprocesos ConcurrentHashMap se crea mediante la estructura de matriz Segment y la estructura de matriz HashEntry, Segment es un bloqueo reentrante ReentrantLock.

**CopyOnWriteArrayList: **El contenedor simultáneo de CopyOnWrite se usa para escenarios simultáneos con más lecturas y menos escrituras, copia en escritura segura para subprocesos.

ReentrantLock : el efecto es el mismo que sincronizado, ambos se pueden ejecutar de forma sincrónica, el método de bloqueo adquiere el bloqueo y el método de desbloqueo libera el bloqueo. ReetrantLockqubie agrega algunas características como votación de bloqueo, espera de bloqueo cronometrada y espera de bloqueo interrumpible.La implementación de ReentrantLock bajo contención es más escalable. ReentrantLock admite bloqueos justos y el mismo subproceso puede adquirir el mismo bloqueo varias veces. Tanto ReentrantLock como sincronizado son bloqueos de reentrada.

CountDownLatch : la clase CountDownLatch se encuentra en el paquete java.util.concurrent y se puede usar para implementar funciones similares a los contadores. Por ejemplo, hay una tarea A, que solo se puede ejecutar después de que se hayan ejecutado las otras tareas 4. En este momento, CountDownLatch se puede usar para realizar esta función.

Semáforo : Es responsable de coordinar varios hilos para garantizar que puedan usar los recursos comunes de manera correcta y razonable. Semaphore puede controlar la cantidad de recursos a los que se puede acceder al mismo tiempo, obtener una licencia a través de la adquisición (), si no, espere y release () libera una licencia para proteger el recurso.

Futuro : la interfaz Callable se puede ver como un complemento de la interfaz Runnable.El método de llamada tiene un valor de retorno y puede generar excepciones. Programación concurrente sin valor de retorno implementada por la interfaz ejecutable.

**CyclicBarrier:** Esta clase es una clase de herramienta de sincronización, que permite que un grupo de subprocesos se esperen entre sí y se bloqueen cuando alcanzan un punto de barrera común. La barrera no se abrirá hasta que el último subproceso alcance el punto de barrera común. El hilo bloqueado reanuda la ejecución. Es muy adecuado para situaciones en las que un grupo de subprocesos debe esperar el uno al otro con frecuencia.

Fin del artículo

¡Se pueden escanear más preguntas de entrevistas de Android de forma gratuita!

↓↓↓【Vista previa】↓↓↓

imagen

Supongo que te gusta

Origin blog.csdn.net/Android_XG/article/details/130826819
Recomendado
Clasificación