Resumen de los puntos de conocimiento del marco de recopilación + preguntas de la entrevista de Dachang

Colección: la interfaz más básica de colección Lista, Conjunto, Cola

Mapa: la interfaz básica de la tabla de mapeo

Iterador: Iterador, que puede recorrer los datos en la colección.

(Nota: hay un error en la siguiente figura. Cuando se expande ArrayList, la capacidad se expande 1,5 veces)

 

Lista

Lista es una Colección ordenada. Hay tres clases de implementación en Java List: ArrayList, Vector y LinkedList. 

ArrayList es la clase de implementación de listas más utilizada. Se implementa internamente a través de una matriz. Es adecuada para búsquedas y recorridos aleatorios, pero no para inserción y eliminación (más costosa).

Principio de implementación: matriz, cuando la capacidad no es suficiente, cree una nueva matriz de capacidad, use arraycopy para copiar la matriz original

Vector

Al igual que ArrayList, se implementa a través de matrices, la diferencia es que admite la sincronización de subprocesos, solo un subproceso puede escribir en Vector a la vez, lo que evita las inconsistencias causadas por la escritura simultánea de varios subprocesos, pero la sincronización requiere costos altos, por lo que el acceso es más lento.

Lista enlazada

El uso de una lista enlazada para almacenar datos es adecuado para la inserción y eliminación dinámicas, y la velocidad de acceso y recorrido aleatorio es lenta. Además, también proporciona métodos que no están definidos en la interfaz de Lista, que se utilizan especialmente para operar el encabezado. y elementos de cola, y se pueden usar como pilas y colas, y se usan colas bidireccionales.

 

Colocar

El conjunto se almacena en desorden y no se puede repetir. La esencia de la igualdad de objetos es el valor hashCode (el número de serie calculado por Java en función de la dirección de memoria)

HashSet (tabla hash)

Los elementos de almacenamiento en HashSet no se almacenan en el orden, sino que se obtienen de acuerdo con el valor hash, y el valor hash del elemento se obtiene a través del método hashcod. HashSet primero juzga los valores hash de dos elementos. Si los valores hash son los mismos, luego compara el método de igualdad. Si el resultado de equls es verdadero, HashSet se considera como el mismo elemento. No es el mismo elemento si es igual a falso. 
Si el valor hash es el mismo, se extenderá bajo el mismo valor hash, como se muestra en la figura:

HashSet determina la ubicación de los elementos en la memoria por valor hashCode. Se pueden almacenar varios elementos en una posición de hashCode

 

TreeSet (árbol binario)

TreeSet() es usar el principio del árbol binario para ordenar los objetos del nuevo add() en el orden especificado (orden ascendente, orden descendente). Cada vez que se agrega un objeto, se ordenará y el objeto se insertado en la posición especificada del árbol binario. (Dispuesto fuera de orden, no repetible)

LinkHashSet(HashSet+LinkedHashMap)

Hereda de HashSet y se implementa en base a LinkedHashMap. La capa inferior de LinkedHashSet usa LinkedHashMap para guardar todos los elementos. Hereda de HashSet, y todos sus métodos funcionan igual que HashSet. Por lo tanto, la implementación de LinkedHashSet es muy simple. Solo proporciona cuatro métodos de construcción y al pasar un parámetro de identificación , llame al padre El constructor de la clase se implementa mediante la construcción de un LinkedHashMap en la capa inferior. Las operaciones relacionadas son las mismas que las de la clase principal HashSet, simplemente llame al método de la clase principal HashSet directamente.

 

Mapa

HashMap (matriz + lista enlazada + árbol rojo-negro)

HashMap almacena datos de acuerdo al valor hashCode de la clave, en la mayoría de los casos su valor se puede ubicar directamente, por lo que tiene una velocidad de acceso rápida, pero el orden de recorrido es incierto. HashMap solo permite que la clave de un registro sea nula, y el valor de varios registros puede ser nulo. HashMap no es seguro para subprocesos, es decir, varios subprocesos pueden escribir en HashMap al mismo tiempo en cualquier momento, lo que puede generar inconsistencias en los datos. Si se requiere seguridad para subprocesos, puede usar el métodosynchronedMap de Collections para hacer que HashMap sea seguro para subprocesos o usar ConcurrentHashMap. Usamos la siguiente imagen para presentar la estructura de HashMap:

Dentro de HashMap hay una matriz, y cada elemento de la matriz es una lista vinculada unidireccional. En la figura anterior, cada entidad verde es una instancia de la entrada de clase anidada, y la entrada contiene cuatro atributos: clave, valor, valor hash y siguiente para una lista vinculada unidireccional.

1. Capacidad: la capacidad actual de la matriz, que siempre es 2^n, se puede expandir. Después de la expansión, el tamaño de la matriz es el doble del tamaño actual.

2. loadFactor: factor de carga, el valor predeterminado es 0,75. 

3. umbral: el umbral de expansión, igual a la capacidad * factor de carga

Implementación de JAVA8

Java8 ha hecho algunas modificaciones a HashMap, la gran diferencia es el uso del árbol rojo-negro, por lo que se compone de matriz + lista enlazada + árbol rojo-negro. 
De acuerdo con la introducción de Java7 HashMap, sabemos que cuando buscamos, podemos ubicar rápidamente el subíndice específico de la matriz de acuerdo con el valor hash, pero después de eso, debemos comparar uno por uno a lo largo de la lista vinculada para encontrar lo que necesitamos. La complejidad del tiempo depende de La longitud de la lista enlazada es O(n). Para reducir esta parte de la sobrecarga, en Java8, cuando el número de elementos en la lista enlazada supera los 8, la lista enlazada se convertirá en un árbol rojo-negro y la complejidad del tiempo se puede reducir a O(logN) al buscar en estas posiciones. 
 
 

HashTable (seguro para subprocesos)

Hashtable es una clase heredada. Muchas funciones comunes de mapeo son similares a HashMap. La diferencia es que hereda de la clase Dictionary y es seguro para subprocesos. Solo un subproceso puede escribir en Hashtable a la vez. La concurrencia no es tan buena. como ConcurrentHashMap, porque ConcurrentHashMap introduce el bloqueo de segmentación. No se recomienda el uso de Hashtable en código nuevo. Se puede reemplazar por HashMap cuando no se requiere seguridad de subprocesos, y ConcurrentHashMap se puede reemplazar por seguridad de subprocesos cuando se requiere seguridad de subprocesos. 

TreeMap (ordenable)

TreeMap implementa la interfaz SortedMap, que puede ordenar los registros que guarda de acuerdo con la clave. El valor predeterminado es el orden ascendente del valor de la clave. También puede especificar el comparador de ordenación. Al usar Iterator para recorrer el TreeMap, los registros obtenidos se ordenan . 
Si usa mapas ordenados, se recomienda TreeMap. 
Al usar TreeMap, la clave debe implementar la interfaz Comparable o pasar un Comparador personalizado al construir TreeMap; de lo contrario, se generará una excepción de tipo java.lang.ClassCastException en tiempo de ejecución.

LinkHashMap (orden de inserción de registros)

LinkedHashMap es una subclase de HashMap, que guarda el orden de inserción de los registros.Cuando se utiliza Iterator para atravesar LinkedHashMap, los registros obtenidos primero deben insertarse primero, y también se pueden construir con parámetros, ordenados según el orden de acceso. 

 

preguntas de entrevista

1. La diferencia entre ArrayList y Vector

Ambas clases implementan la interfaz List y son colecciones ordenadas que se pueden repetir.

La diferencia entre los dos es principalmente en dos partes:

Sincronización: Vector es seguro para subprocesos, lo que indica que sus subprocesos están sincronizados, mientras que ArrayList no es seguro para subprocesos y no está sincronizado. Cuando solo accede un subproceso, use ArrayList sin tener en cuenta la seguridad del subproceso, que es más eficiente; varios subprocesos acceden a las colecciones, use Vecctor sin consideración y escriba código seguro para subprocesos

Crecimiento de datos: ambos tienen una capacidad inicial. Cuando la capacidad es insuficiente, Vector duplicará su tamaño original cada vez y ArrayList crecerá hasta 1,5 veces su tamaño original de forma predeterminada. Tanto ArrayList como Vector pueden establecer el tamaño del espacio inicial y Vector también puede establecer el
tamaño del espacio de crecimiento, mientras que ArrayList no proporciona un método para establecer el espacio de crecimiento.

2. Hable sobre el rendimiento del almacenamiento y las características de ArrayList, Vector, LinkedList

Tanto ArrayList como Vector usan matrices para almacenar datos. La cantidad de elementos en esta matriz es mayor que los datos almacenados reales
para agregar e insertar elementos. Ambos permiten indexar elementos directamente por número de serie, pero la inserción de elementos implica
operaciones de memoria como mover la matriz. elementos, por lo que la indexación de datos es rápida pero la inserción de datos es lenta, porque Vector utiliza 
el método sincronizado (seguridad de subprocesos). 
Por lo general, el rendimiento es peor que ArrayList, mientras que LinkedList utiliza una lista doblemente enlazada para el almacenamiento.La indexación de datos por número de serie
requiere un recorrido hacia adelante o hacia atrás, pero al insertar datos, solo necesita registrar los elementos frontal y posterior de este elemento, por lo
que el la velocidad de inserción
ArrayList es rápido al buscar y LinkedList tiene más ventajas al insertar y eliminar. 

3. ¿Cuál es la diferencia entre falla rápida y falla segura?

La protección contra fallas de Iterator se basa en hacer una copia de la colección subyacente, por lo que no se ve afectada por las modificaciones en la colección de origen.
Todas las clases de colección en el paquete java.util son a prueba de fallas, mientras que
todas las clases en el paquete java.util.concurrent son a prueba de fallas. Fail : los iteradores rápidos lanzan 
ConcurrentModificationException, mientras que los iteradores a prueba de fallas nunca lanzan

4. La estructura de datos de hashmap

(Las estructuras de datos en el lenguaje de programación Java son solo arreglos y listas enlazadas) HashMap utiliza una combinación de arreglos y listas enlazadas, lo que se denomina hash de lista enlazada (hashing)

5. ¿Cuál es el principio de funcionamiento de HashMap?

HashMap almacena elementos en forma de pares clave-valor. HashMap requiere una función hash, que usa los métodos hashCode() y equals() para agregar y recuperar elementos a la colección. Llame al método put, hashMap calculará el valor hash de la clave y luego almacenará el par clave-valor en el índice apropiado. Si la clave no está allí, el valor se actualizará a un nuevo valor. Algunas características importantes de HashMap son su capacidad, factor de carga y
cambio de tamaño de umbral.

6. ¿Cuándo se expandirá Hashmap?

Cuando el número de elementos hashmap supera el factor de carga del tamaño de la matriz, la matriz se expande. El factor de carga predeterminado es 0,75 y el tamaño de la matriz predeterminado es 16. Cuando el número supera los 12, se duplicará y luego se volverá a calcular cada elemento en la posición del arreglo en .

7. ¿Cuáles son las características de las tres interfaces de List, Map y Set al acceder a los elementos?

En primer lugar, tanto List como Set son colecciones de elementos de una sola columna y sus interfaces principales son Collection. Set no permite elementos repetidos, es decir, no puede haber dos elementos iguales (iguales), por lo que el método de colección set tiene un valor de retorno booleano para juzgar si es igual.La colección Set no está ordenada y no se puede sacar arbitrariamente.Iterador se puede utilizar Iterar a través de los elementos. List representa una colección ordenada. De acuerdo con el orden agregado por add, el índice especificado apunta a todo el objeto, y un objeto puede eliminarse arbitrariamente.

En segundo lugar, Map es diferente de List y Set. Es una colección de dos columnas. El método put se usa para almacenar clave/valor, y no se puede almacenar el mismo valor clave. Las reglas repetidas también se juzgan por iguales. Al mismo tiempo, todos los valores clave o valores se pueden sacar por separado. , también se puede obtener el valor compuesto (Map.Entry).

La lista contiene elementos en un orden específico y puede tener elementos duplicados. El conjunto no puede tener elementos duplicados, ordenación interna.
El mapa guarda los valores clave-valor, y el valor puede tener varios valores

(HashSet se almacena de acuerdo con un determinado método de cálculo del valor de hashcode, en lugar de directamente según 
el tamaño del valor de hashCode).

8. Los elementos del Conjunto no se pueden repetir, entonces, ¿qué método se usa para distinguir si se repite? ¿Es == o 
igual ()? ¿Cuál es la diferencia entre ellos?

Para determinar si un elemento se repite, use iguales para determinar.

  1.  == es juzgar si dos variables o instancias apuntan al mismo espacio de memoria, y equals es juzgar si los valores de los espacios de memoria apuntados por dos variables o instancias son los mismos 
  2. == se refiere a comparar direcciones de memoria, y equals() compara el contenido de las cadenas
  3. == se refiere a si el uso es el mismo, equals() se refiere a si los valores son los mismos

9. Dos objetos tienen el mismo valor (x.equals(y) == true), pero pueden tener diferentes códigos hash. ¿Es correcta esta oración? 

bien. Si los objetos se van a almacenar en HashSet o HashMap, sus iguales son iguales, entonces sus
valores de código hash deben ser iguales. 
Si no se va a guardar en HashSet o HashMap, no tiene nada que ver con el código hash. En este momento,
es posible tener diferentes códigos hash. Por ejemplo, los objetos almacenados en arrayList no necesitan implementar código hash.
Por supuesto , no tenemos ninguna razón para no implementarlo, y generalmente lo implementamos .

10. ¿Cuál es la diferencia entre montón y pila?

La memoria de Java se divide en memoria de pila y memoria de pila. La memoria de pila significa que después de que el programa ingresa a un método, se abre un espacio de almacenamiento separado para este método para almacenar variables locales en el método. Una vez que finaliza el método, se libera la memoria. La memoria de almacenamiento dinámico se utiliza para almacenar datos que no se colocan en la pila de métodos, como objetos nuevos. Las variables locales se colocan en el montón después de modificarse con final.

11. ¿Cuáles son las interfaces básicas del marco de la clase de colección de Java?

Las interfaces más básicas en la clase de colección Java son:

Colección: representa un conjunto de objetos, cada uno de los cuales es su elemento secundario. 
Conjunto: una colección que no contiene elementos duplicados. 
Lista: una colección secuencial que puede contener elementos repetidos. 
Mapa: un objeto que puede asignar una clave (clave) a un valor (valor), y la clave no se puede repetir

12. ¿Cuál es la diferencia entre HashSet y TreeSet?

HashSet se implementa mediante una tabla hash. Los elementos están desordenados y el contenido colocado no se puede repetir. Solo se puede colocar un valor nulo una vez.

TreeSet se implementa mediante una estructura de árbol binario, los elementos que contiene están ordenados y no se puede colocar un valor nulo

13. ¿Cuál es la implementación subyacente de HashSet? 

La implementación de HashSet depende de HashMap, y el constructor de hashSet inicializará un objeto hashMap. HashSet no permite valores duplicados, por lo tanto, el valor de HashSet se almacena en HashMap como la clave de HashMap y devuelve falso cuando el valor almacenado ya existe

14. ¿Cuál es el principio de implementación de LinkedHashMap?

LinkedHashMap también se implementa en base a HashMap. La diferencia es que define un encabezado de Entrada. Este encabezado no se coloca en la tabla, pero además es independiente. LinkedHashMap hereda la Entrada en hashMap y agrega dos atributos Entrada antes, después y encabezado Combinado para formar una lista doblemente enlazada para lograr ordenar por orden de inserción o por orden de acceso.

LinkedHashMap define el modo de clasificación accessOrder, que es una variable booleana, para el orden de acceso, es verdadero; para el orden de inserción, es falso. En general, no es necesario especificar un modo de clasificación y el orden de iteración es el orden de inserción predeterminado. 

15. ¿Por qué la clase de colección no implementa las interfaces Clonable y Serializable?

La semántica y el significado de clonación o serialización son específicos de la implementación.
Por lo tanto, la implementación específica de la clase de colección debe determinar cómo se clona o serializa.

16. ¿Qué es un iterador?

La interfaz Iterator proporciona muchos métodos para iterar sobre los elementos de la colección. Cada clase de colección contiene métodos que devuelven instancias de iterador. El iterador puede eliminar los elementos de la colección subyacente durante el proceso de iteración, pero no puede llamar directamente al método remove() de la colección y puede eliminarse a través del método remove() del iterador.

17. ¿Cuál es la diferencia entre Iterator y ListIterator?

Iterator se puede usar para recorrer colecciones Set y List, pero ListIterator solo se puede usar para recorrer List. 
Iterator solo puede recorrer la colección hacia adelante, y ListIterator puede avanzar y retroceder. 
ListIterator implementa la interfaz Iterator y contiene otras funciones, como: agregar elementos, reemplazar elementos
, obtener el índice del elemento anterior y siguiente, etc.

18. ¿Cuál es la diferencia entre una matriz (Array) y una lista (ArrayList)? ¿Cuándo debería usar Array en lugar de ArrayList?

Array puede contener tipos básicos y tipos de objetos, ArrayList solo puede contener tipos de objetos, el tamaño de Array es fijo, ArrayList es dinámico,

ArrayList es más lento cuando se trata de tipos de datos primitivos de tamaño fijo.

19. ¿Cuáles son las mejores prácticas del marco de trabajo de la clase de colección de Java?

 Si el tamaño de los elementos es fijo y conocido de antemano, deberíamos usar Array en lugar de ArrayList. 
 Algunas clases de colección permiten especificar una capacidad inicial. Por lo tanto, si podemos estimar la cantidad de elementos almacenados, podemos establecer la capacidad inicial para evitar volver a calcular el valor hash o expandir la capacidad. 
 Utilice siempre genéricos por motivos de seguridad, legibilidad y solidez de los tipos. Al mismo tiempo, el uso de genéricos también puede evitar ClassCastException en tiempo de ejecución. 
 Usar la clase inmutable provista por JDK como la clave de Map puede evitar implementar los métodos hashCode() y equals() para nuestra propia clase. 
 Al programar, se prefiere la interfaz a la implementación. 
 Cuando la colección subyacente está realmente vacía, devuelve una colección o matriz con longitud 0, no devuelve nulo

20. ¿Para qué sirven las interfaces Comparable y Comparator? enumere sus diferencias

La interfaz Comparable solo proporciona un método compareTo(), que puede clasificar dos objetos. Específicamente, devuelve números negativos, 0 y números positivos para indicar que el objeto de entrada es menor, igual o mayor que el objeto existente. Comparator proporciona métodos compare() y equals(), el primero se usa para ordenar dos parámetros de entrada, devolver números negativos, 0 y números positivos que representan menor que, igual a, mayor que. El método equals() requiere un objeto como parámetro, que se usa para determinar si el parámetro de entrada es igual al comparador. Este método devuelve verdadero solo si el parámetro de entrada también es un comparador y el resultado de clasificación del parámetro de entrada y el comparador actual es el mismo. 

21. La diferencia entre Colección y Colecciones

collection es la interfaz de nivel superior de la clase de colección, y las interfaces heredadas de ella son principalmente set y list. La clase de colecciones es una clase auxiliar para la clase de colección. Proporciona una serie de métodos estáticos para buscar, ordenar, seguridad de subprocesos y otras operaciones
en varias colecciones.

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_40513633/article/details/107258744
Recomendado
Clasificación