Cuestiones relacionadas con la búsqueda de empleo en prácticas de JAVA

Introduccion

Primero describa brevemente la estructura de la colección en Java, dividida en dos categorías: colección de una columna Colección y colección de doble columna Conjunto

Colección de una sola columna: ordenada y repetible, generalmente utilizada para reemplazar matrices, llamadas matrices variables

Mapa de colección de doble columna:

 

La diferencia entre ArrayList, Vector y LinkedList

ArrayList: como una de las principales clases de implementación de la interfaz List, el subproceso es inseguro y altamente eficiente. La parte inferior utiliza Object [] elementData para el almacenamiento.

JDK7:

ArrayList list = new ArrayList (); // La capa inferior creó Object [] array elementData de longitud 10

list.add (123); // elementData [0] = new Integer (123);

...

list.add (11); // Si esta adición resulta en una capacidad insuficiente de la matriz elementData subyacente, expanda la capacidad.

De manera predeterminada, la capacidad se expande a 1,5 veces la capacidad original, y los datos en la matriz original deben copiarse en la nueva matriz.

JDK8:

ArrayList list = new ArrayList (); // El ObjectData subyacente [] elementData se inicializa en {}. No se crea una matriz de longitud 10

list.add (123); // Cuando la primera llamada a add (), la capa inferior creó una matriz de longitud 10 y agregó los datos 123 a elementData [0]

Las operaciones posteriores de adición y expansión no son diferentes de jdk 7.

Resumen resumido: la creación del objeto ArrayList en jdk7 es similar al hambre de singleton, mientras que la creación del objeto ArrayList en jdk8 es similar a la holgura de singleton, retrasando la creación de la matriz y ahorrando memoria.

LinkedList: para operaciones frecuentes de inserción y eliminación, el uso de este tipo de eficiencia es mayor que ArrayList; la parte inferior utiliza un almacenamiento de lista doblemente vinculado.

LinkedList list = new LinkedList (); Las propiedades primera y última del tipo de nodo se declaran internamente y el valor predeterminado es nulo

list.add (123); // Encapsula 123 en Node y crea un objeto Node.

Entre ellos, Nodo se define como: una declaración que refleja la lista doblemente vinculada de LinkedList

Nodo de clase estática privada <E> {
            E item;
            Nodo <E> siguiente;
            Nodo <E> anterior;

            Nodo (Nodo <E> anterior, elemento E, Nodo <E> siguiente) {
            this.item = elemento;
            this.next = next;
            this.prev = prev;
            }
        }

Vector: como la antigua clase de implementación de la interfaz List; segura para subprocesos, de baja eficiencia; la parte inferior usa Object [] elementData storage

Al crear objetos a través del constructor Vector () en jdk7 y jdk8, la capa inferior crea una matriz de longitud 10.
En términos de expansión de capacidad, la expansión de capacidad predeterminada es el doble de la longitud de la matriz original.

HashSet

La capa inferior de HashSet todavía usa el almacenamiento de matrices y listas vinculadas, principalmente reflejado en el desorden y la no repetibilidad

Al agregar el elemento a al HashSet, primero llame al método hashCode () del elemento a para calcular el valor hash del elemento a, y calcule este valor hash a través de un algoritmo algoritmo hash para calcular la posición i en una matriz. Cuando la posición i en la matriz no existe Cuando se agrega el elemento, el elemento a se agrega con éxito; si el elemento b existe en la posición i, se compara el valor hash de b y el valor hash de a. Si no son lo mismo, use una lista vinculada para almacenar ayb en la posición i; si el valor hash es el mismo, compare el método igual No se almacena lo mismo, lo diferente se almacena en una lista vinculada.

HashMap

JDK7

Mapa de HashMap = nuevo HashMap (): después de la creación de instancias, la capa inferior crea una tabla de entrada de matriz unidimensional de longitud 16.

... puede haber realizado múltiples operaciones de venta ...

 map.put (key1, value1): Primero, llame al hashCode () de la clase a la que pertenece key1 para calcular el valor hash key1.Después de que un algoritmo calcula este valor hash, obtiene la ubicación de almacenamiento en la matriz de Entrada. Si los datos en esta ubicación están vacíos, la clave1-valor1 se agrega con éxito. ---- Situación. Si los datos en esta ubicación no están vacíos (lo que significa que hay uno o más datos en esta ubicación (en forma de una lista vinculada)), compare el valor hash de key1 y uno o más datos existentes: si key1 tiene El valor de esperanza es diferente del valor hash de los datos existentes. En este momento, la clave1-valor1 se agrega con éxito. ---- Caso 2. Si el valor hash de key1 es el mismo que el valor hash de uno de los datos existentes (key2-value2) (colisión hash), continúe comparando: llame al método equals (key2) de la clase a la que pertenece key1, compare: if equals () devuelve falso: clave1-valor1 se agrega con éxito. ---- Caso 3. Si equals () devuelve verdadero: reemplace value2 con value1. Suplemento: sobre el caso 2 y el caso 3: en este momento, clave1-valor1 y los datos originales se almacenan en una lista vinculada.

En el proceso de adición continua, implicará el problema de expansión: cuando se excede el valor crítico (y la ubicación a almacenar no está vacía), se realiza la expansión. Método de expansión predeterminado: expanda al doble de la capacidad original y copie los datos originales.

HashMap en jdk8 es diferente de jdk7 en la implementación subyacente:
1. nuevo HashMap (): la capa inferior no crea una matriz de longitud
2. jdk 8 La matriz de capa inferior es: Nodo [], no Entrada []
3 Cuando se llama al método put () por primera vez, la capa inferior crea una matriz con una longitud de 16.
4. La estructura subyacente de jdk7 es solo: matriz + lista vinculada. La estructura subyacente de jdk8: matriz + lista vinculada + árbol rojo-negro.
4.1 Al formar una lista vinculada, vaya hacia arriba y hacia abajo (jdk7: el nuevo elemento apunta al elemento anterior. Jdk8: el elemento antiguo apunta al nuevo elemento)
4.2 Cuando el elemento en una posición de índice de la matriz existe en forma de una lista vinculada, el número de datos> 8 y cuando la longitud de la matriz actual es> 64, todos los datos en esta posición de índice ahora se almacenan utilizando árboles rojos y negros.

Árbol rojo negro

Para resolver el problema de los conflictos hash, es decir, una larga lista vinculada se cuelga bajo un valor hash, por lo que en jdk1.8 la capa inferior de HashMap consta de matrices, listas vinculadas y árboles rojo-negro. El árbol rojo-negro es un árbol de búsqueda binario equilibrado. "Balance" significa que no hay un subárbol que sea muy largo.

Varias características de los árboles rojo-negros:

(1) El nodo es rojo o negro

(2) El nodo raíz debe ser negro

(3) El nodo hoja debe ser un nodo Nulo negro

(4) Los dos nodos secundarios de cada nodo rojo deben ser negros

(5) La ruta desde cualquier nodo en el árbol a cada nodo hoja contiene el mismo número de nodos negros

El árbol rojo-negro puede garantizar las tres armas mágicas de auto-equilibrio: zurdo, diestro y decoloración.

Rotación hacia la izquierda: el nodo derecho del nodo de rotación es el nodo principal, y el subárbol izquierdo del nodo derecho se usa como el subárbol derecho del nodo de rotación

Rotación a la derecha: el nodo izquierdo del nodo de rotación se convierte en el nodo principal, y el subárbol derecho del nodo izquierdo se convierte en el subárbol izquierdo del nodo de rotación

Decoloración:

 

111 artículos originales publicados · Me gusta 60 · 70,000 + vistas

Supongo que te gusta

Origin blog.csdn.net/Haidaiya/article/details/105528027
Recomendado
Clasificación