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?
List
secuencia, repetibleSet
únicoQueue
Implementar colasMap
Almacenado 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
,LinkedList
casi todos los escenarios que deben usarse puedenArrayList
reemplazarse, ¡y el rendimiento suele ser mejor! InclusoLinkedList
Josh Bloch, el autor de, dice que nunca lo usaLinkedList
.
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
comparable
La interfaz es en realidad deljava.lang
paquete que tiene uncompareTo(Object obj)
método para ordenarcomparator
La interfaz es en realidad del paquete java.util que tiene uncompare(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,
LinkedHashSet
la estructura de datos subyacente es una lista vinculada y una tabla hash,TreeSet
la estructura de datos subyacente es un árbol rojo-negro, - Los escenarios de aplicación son diferentes, dependiendo de los requisitos para el pedido,
HashSet
se utiliza en escenarios que no necesitan asegurar el orden de inserción y extracción de elementos,LinkedHashSet
se utiliza en escenarios que aseguran que el orden de inserción y extracción de elementos cumple FIFO , yTreeSet
se utiliza en escenarios que admiten reglas de clasificación personalizadas para elementos .
La diferencia entre cola y deque
Queue
Es 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) .Deque
Es 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
HashMap
Puede 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 Map la interfaz |
implementar Set la interfaz |
Almacenar pares clave-valor | almacenar solo objetos |
Llamar put() para agregar elementos al mapa |
Método de llamada add() para Set agregar elemento a |
HashMap Informática con llaveshashcode |
HashSet Use objetos miembros para calcular hashcode el 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?
HashSet
El add()
método simplemente llama al HashMap
mé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
ConcurrentHashMap
La diferencia entre y Hashtable
se 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:
ConcurrentHashMap
está bloqueado el segmentoHashtable
solo un candado
ConcurrentHashMap
La diferencia entre yHashtable
se 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.8HashMap1.8
es la misma que la de matriz + lista vinculada/árbol binario rojo-negro.Hashtable
Similar a la estructura de datos subyacente antes de JDK1.8 ,HashMap
adopta 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,
ConcurrentHashMap
toda 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,
ConcurrentHashMap
se abandonó el concepto deSegment
, peroNode
se implementó directamente con la estructura de datos de matriz + lista vinculada + árbol rojo-negro, y los usos de control de concurrenciasynchronized
y CAS para operar. (Los bloqueos se han optimizado mucho después de JDK1.6synchronized
) Todo parece optimizado y seguro para subprocesosHashMap
, aunque la estructura de datos todavía se puede ver en JDK1.8Segment
, pero los atributos se han simplificado, solo para que sean compatibles con la versión anterior. ;Hashtable
(mismo bloqueo) : el usosynchronized
para 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.