Entrevista de la colección Java

Entrevista común de la colección Java

Descripción general de las colecciones de Java

Implementar principalmente dos interfaces

  • Recopilación
  • Mapa

¿Dime la diferencia entre Lista, Conjunto, Cola y Mapa?

  • Listsecuencia, repetible
  • Setúnico
  • QueueImplementar colas
  • MapAlmacenado en pares clave-valor (clave-valor), buscable por clave

¿Diferencia entre ArrayList y Vector?

  • Es la principal clase de implementación de List, que no es segura para subprocesos.
  • Es una clase de implementación antigua de List, generalmente no se usa, pero es segura para subprocesos.

¿Cuál es la diferencia entre ArrayList y LinkedList?

  • No se garantiza que los hilos sean seguros
  • La implementación de la estructura de datos subyacente es diferente: uno usa una matriz y el otro usa una lista doblemente enlazada
  • ArrayList inserta más elementos móviles y LinkedList es fácil de insertar (pero no particularmente conveniente)
  • arrayList admite acceso aleatorio rápido mientras que el otro no
  • Ocupación de espacio de memoria: LinkedList será más grande porque se almacenan punteros

Por lo general, no usamos en proyectos LinkedList, LinkedListcasi todos los escenarios que deben usarse pueden ArrayListreemplazarse, ¡y el rendimiento suele ser mejor! Incluso LinkedListJosh Bloch, el autor de, dice que nunca lo usa LinkedList.

Hablemos del mecanismo de expansión de ArrayList

  • se llama a sureCapacityInternal() para garantizar la capacidad antes de insertar elementos
  • Cuando la capacidad sea insuficiente, se llamará al método de crecimiento y la nueva capacidad será 1,5 veces la capacidad anterior
  • copiar datos antiguos a nuevos

La diferencia entre comparable y comparador

  • comparableLa interfaz es en realidad del java.langpaquete que tiene un compareTo(Object obj)método para ordenar
  • comparatorLa interfaz es en realidad del paquete java.util que tiene un compare(Object obj1, Object obj2)método para ordenar

¿Cuál es el significado de desorden e irrepetibilidad?

  • Sin ordenar significa que el almacenamiento subyacente no tiene orden, pero el orden se determina de acuerdo con el valor hash de los datos.
  • La no repetibilidad se refiere al juicio de igualdad al agregar elementos

Compara las similitudes y diferencias entre HashSet, LinkedHashSet y TreeSet

  • Todas son clases de implementación de Set, no seguras para subprocesos.
  • HashSet se basa en la tabla hash, LinkedHashSetla estructura de datos subyacente es una lista vinculada y una tabla hash, TreeSetla estructura de datos subyacente es un árbol rojo-negro,
  • Los escenarios de aplicación son diferentes, dependiendo de los requisitos para el pedido, HashSetse utiliza en escenarios que no necesitan asegurar el orden de inserción y extracción de elementos, LinkedHashSetse utiliza en escenarios que aseguran que el orden de inserción y extracción de elementos cumple FIFO , y TreeSetse utiliza en escenarios que admiten reglas de clasificación personalizadas para elementos .

La diferencia entre cola y deque

  • QueueEs una cola de un solo extremo, que solo puede insertar elementos de un extremo y eliminar elementos del otro extremo. La implementación generalmente sigue la regla de primero en entrar, primero en salir (FIFO) .
  • DequeEs una cola de dos extremos y los elementos se pueden insertar o eliminar en ambos extremos de la cola.

La diferencia entre HashMap y Hashtable

  • HashMap no es seguro para subprocesos, Hashtable es seguro para subprocesos (usando sincronizado para modificar el método interno)
  • Debido a problemas de seguridad de subprocesos, HashMap es más eficiente
  • HashMapPuede almacenar clave nula y valor
  • En HashMap, cuando la longitud de la lista vinculada es mayor que el umbral (el valor predeterminado es 8), la lista vinculada se convierte en un árbol rojo-negro (se evaluará antes de convertir la lista vinculada en un árbol rojo-negro, si la longitud de la matriz actual es inferior a 64, luego la matriz se expandirá primero, en lugar de convertirse en un árbol rojo-negro), no existe tal mecanismo para HashTable

La diferencia entre HashMap y HashSet

HashMap HashSet
implementa Mapla interfaz implementar Setla interfaz
Almacenar pares clave-valor almacenar solo objetos
Llamar put()para agregar elementos al mapa Método de llamada add()para Setagregar elemento a
HashMapInformática con llaveshashcode HashSetUse objetos miembros para calcular hashcodeel valor, que puede ser el mismo para dos objetos hashcode, por lo que equals()el método se usa para juzgar la igualdad de los objetos.

¿Cómo comprueba HashSet si hay duplicados?

HashSetEl add()método simplemente llama al HashMapmétodo put()y juzga el valor devuelto para asegurarse de que no haya elementos duplicados.

La implementación subyacente de HashMap

La forma de resolver los conflictos de hash ha cambiado

Antes de JDK1.8

Después de JDK1.8

La diferencia entre ConcurrentHashMap y Hashtable

ConcurrentHashMapLa diferencia entre y Hashtablese refleja principalmente en las diferentes formas de lograr la seguridad de subprocesos .

  • La estructura de datos es diferente: uno es una matriz más un árbol o una lista enlazada, y el otro es un dato más una lista enlazada
  • Las implementaciones de seguridad de subprocesos difieren:
    • ConcurrentHashMapestá bloqueado el segmento
    • Hashtablesolo un candado

ConcurrentHashMapLa diferencia entre y Hashtablese refleja principalmente en las diferentes formas de lograr la seguridad de subprocesos.

  • Estructura de datos inferior:ConcurrentHashMap la capa inferior de JDK1.7 se realiza mediante una matriz segmentada + lista vinculada , y la estructura de datos utilizada por JDK1.8 HashMap1.8es la misma que la de matriz + lista vinculada/árbol binario rojo-negro. HashtableSimilar a la estructura de datos subyacente antes de JDK1.8 , HashMapadopta la forma de matriz + lista enlazada.La matriz es el cuerpo principal de HashMap, y la lista enlazada existe principalmente para resolver conflictos hash;
  • La forma de lograr la seguridad de subprocesos (importante):
    • En el momento de JDK1.7, ConcurrentHashMaptoda la matriz de cubos se dividió en segmentos ( Segment, bloqueos segmentados), cada bloqueo solo bloquea parte de los datos en el contenedor (consulte el diagrama a continuación) y acceso de subprocesos múltiples a datos en diferentes datos. segmentos en el contenedor, no habrá competencia de bloqueo y se mejorará la tasa de acceso concurrente.
    • En el momento de JDK1.8, ConcurrentHashMapse abandonó el concepto de Segment, pero Nodese implementó directamente con la estructura de datos de matriz + lista vinculada + árbol rojo-negro, y los usos de control de concurrencia synchronizedy CAS para operar. (Los bloqueos se han optimizado mucho después de JDK1.6 synchronized) Todo parece optimizado y seguro para subprocesos HashMap, aunque la estructura de datos todavía se puede ver en JDK1.8 Segment, pero los atributos se han simplificado, solo para que sean compatibles con la versión anterior. ;
    • Hashtable(mismo bloqueo) : el uso synchronizedpara garantizar la seguridad del subproceso es muy ineficiente. Cuando un subproceso accede al método de sincronización, otros subprocesos también acceden al método de sincronización y pueden entrar en un estado de bloqueo o sondeo, como usar put para agregar elementos, otro subproceso no puede usar put para agregar elementos, ni puede usar get, y el la competencia será cada vez más feroz Cuanto menos eficiente.

Supongo que te gusta

Origin blog.csdn.net/weixin_51209821/article/details/129124329
Recomendado
Clasificación