A menudo encontré tales preguntas durante las entrevistas en el pasado. Por desgracia, me da vergüenza, la base es demasiado pobre, no hay forma, me siento perjudicado
Ahora tenemos que hablar sobre las diferencias y conexiones entre estos tres: estos tres implementan la interfaz de la lista, todos tienen métodos definidos en la interfaz de la lista y también tienen métodos de la interfaz de recopilación;
ArrayList: utiliza el método de matriz para almacenar datos, consulta y velocidad de modificación es rápida, pero la velocidad de adición y eliminación es lenta;
LinkedList: utiliza el método de lista vinculada para almacenar datos, la velocidad de consulta y modificación es lenta, pero la velocidad de adición y eliminación es rápida.
Vector: también usa matrices para el almacenamiento. iteradores, enumeraciones, get (int index) e indexOf (int index), pero ArrayList no tiene enumeraciones
ArrayList y Vector usan matrices para almacenar datos. Operaciones, por lo que se inserta rápidamente los datos. O transversal hacia atrás, pero solo se requiere este elemento al insertar datos.
Las tablas lineales, las listas vinculadas y las tablas hash son estructuras de datos de uso común. Estas clases están todas en el paquete java.util. Este artículo intenta explicar a los lectores el papel de cada clase y cómo usarlos correctamente a través de una descripción simple.
Colección ├list │ ├linkedList │ ├arrayList │ └vector │ └Stack └SetMap ├hashtable ├hashmap └weakhashmap
Interfaz de colección
La colección es la interfaz de colección más básica. Algunas colecciones permiten los mismos elementos, mientras que otras no. Algunos pueden ordenarse, pero otros no pueden. Java SDK no proporciona clases que se heredan directamente de la colección.
Todas las clases que implementan la interfaz de colección deben proporcionar dos constructores estándar: el constructor sin parámetros se utiliza para crear una colección vacía, y se utiliza un constructor de parámetros de colección para crear una nueva colección, esta nueva colección y pase. mismo elemento. El último constructor permite al usuario copiar una colección.
¿Cómo iterar a través de cada elemento de una colección? Independientemente del tipo real de la colección, admite un método Iterator (), que devuelve un iterador, y utiliza este iterador para acceder a cada elemento en la colección uno por uno. Los usos típicos son los siguientes:
Iterator it = collection.iterator ();
Las dos interfaces derivadas de la interfaz de colección son listas y establecidas.
Interfaz de lista
La lista es una colección ordenada, y el uso de esta interfaz le permite controlar con precisión la posición de cada inserción de elementos. Los usuarios pueden usar índices (la posición de los elementos en la lista, similares a los subíndices de matriz) para acceder a elementos en la lista, que es similar a las matrices de Java.
A diferencia del conjunto mencionado a continuación, la lista permite los mismos elementos.
Además del método Iterator () que tiene la interfaz de colección necesaria, la lista también proporciona un método ListIterator () que devuelve una interfaz ListIterator en comparación con la interfaz ITerator estándar, ListIterator tiene más métodos como Add (), permitiendo la adición, la adición, la adición, Eliminar, establecer elementos y también puede atravesar hacia adelante o hacia atrás.
Las clases comunes que implementan interfaces de lista incluyen LinkedList, ArrayList, Vector y Stack.
Clase de LinkedList
LinkedList implementa la interfaz de la lista, permitiendo elementos nulos. Además, LinkedList proporciona métodos adicionales Get, Eliminar, Insertar en el encabezado o la cola de LinkedList. Estas operaciones permiten que LinkedList se use como pila, cola o cola de dos vías.
Tenga en cuenta que LinkedList no tiene un método sincrónico. Si varios subprocesos acceden a una lista al mismo tiempo, debe implementar la sincronización de acceso usted mismo. Una solución es construir una lista sincrónica al crearla:
List list = collections.synchronizedList (new LinkedList (...));
Clase ArrayList
ArrayList implementa matrices de tamaño variable. Permite todos los elementos, incluido NULL. ArrayList no está sincronizada.
El tiempo de ejecución del tamaño, isEmty, get, set métodos es constante. Sin embargo, la sobrecarga del método ADD es una constante amortizada, y se necesita tiempo para agregar N elementos. Los otros métodos tienen tiempo de ejecución lineal.
Cada instancia de ArrayList tiene una capacidad, que es el tamaño de la matriz utilizada para almacenar elementos. Esta capacidad puede aumentar automáticamente a medida que se agregan constantemente elementos nuevos, pero el algoritmo de crecimiento no está definido. Cuando se necesita insertar una gran cantidad de elementos, se puede llamar al método Ensurecapacity antes de insertar para aumentar la capacidad de ArrayList para mejorar la eficiencia de la inserción.
Al igual que LinkedList, ArrayList también no está sincronizado.
Clase vectorial
El vector es muy similar a ArrayList, pero el vector es sincrónico. Iterador creado por vector, aunque iterator creado por ArrayList, es la misma interfaz que Iterator creada por ArrayList, porque el vector se sincroniza, cuando se crea un iterador y se está utilizando, otro subproceso cambia el estado del vector (por ejemplo, agregando, agregando o eliminar algunos) En este momento, la concepción de modificación concurrente se lanzará cuando se llame al método iterador, por lo que la excepción debe ser capturada.
Clase de pila
La pila hereda de Vector, implementando una pila de primera entrada. Stack proporciona 5 métodos adicionales para permitir que Vector se utilice como pila. Los métodos básicos de empuje y POP, y el método PEEK obtienen los elementos en la parte superior de la pila, el método vacío prueba si la pila está vacía y el método de búsqueda detecta la posición de un elemento en la pila. Stack acaba de crear y es una pila vacía.
Establecer interfaz
SET es una colección que no contiene elementos duplicados, es decir, dos elementos E1 y E2 tienen E1.Equals (E2) = False, y SET tiene como máximo un elemento nulo.
Obviamente, el constructor de SET tiene una restricción, y el parámetro de recolección aprobado no puede contener elementos duplicados.
Tenga en cuenta: los objetos mutables deben operarse con cuidado. Si un elemento mutable en un conjunto cambia su propio estado, causando objeto.equals (objeto) = verdadero para causar algunos problemas.
Interfaz de mapa
Tenga en cuenta que MAP no hereda la interfaz de colección, y MAP proporciona una asignación de clave a valor. Un mapa no puede contener la misma clave, y cada clave solo puede asignar un valor. La interfaz del mapa proporciona tres tipos de vistas de la colección.
Clase hashtable
Hashtable hereda la interfaz del mapa e implementa una tabla hash con un mapeo de valor clave. Cualquier objeto no nulo se puede usar como clave o valor.
Use PUT (clave, valor) para agregar datos, use (clave) para recuperar datos.
La hashtable ajusta el rendimiento a través de la capacidad inicial y los parámetros del factor de carga. Por lo general, el factor de carga predeterminado 0.75 puede lograr mejor el tiempo y el equilibrio de espacio. Aumentar el factor de carga puede ahorrar espacio, pero el tiempo de búsqueda correspondiente aumentará, lo que afectará las operaciones como Get and Put.
Un ejemplo simple de usar un hashtable es el siguiente: poner 1, 2 y 3 en un hashtable, y sus claves son "una", "dos", "tres" respectivamente:
HASHTABLE NÚMEROS = new Hashtable ();
números.put ("one", nuevo entero (1));
números.put ("dos", nuevo entero (2));
números.put ("tres", nuevo entero (3));
Para sacar un número, como 2, use la clave correspondiente:
Entero n = (entero) números.get ("dos");
System.out.println ("two =" + n);
Dado que un objeto como clave determinará la posición del valor correspondiente calculando su función hash, cualquier objeto como clave debe implementar los métodos hashcode e igual. HASHCODE Y EQUILTA MÉTODOS HEREMENTE DEL ENTRADO DE LA CLASE ROOT. ) = Verdadero, entonces su hashcode debe ser el mismo, pero si los dos objetos son diferentes, sus hashcodes pueden no ser diferentes. de operar tablas de hash para aumentar.
Si el mismo objeto tiene diferentes hashcodes, la operación en la tabla hash tendrá resultados inesperados (el método get esperado devuelve nulo). al mismo tiempo.
La hashtable está sincronizada.
Clase de hashmap
Hashmap es similar a la hashtable, la diferencia es que HASHMAP es asíncrono y permite que NULL, es decir, valor nulo y clave nula. , pero cuando hashmap se considera una colección (el método valores () puede devolver una colección), su gastos generales de tiempo de suboperación iterativo es proporcional a la capacidad de HASHMAP. Por lo tanto, si el rendimiento de las operaciones de iteración es muy importante, no establece que la capacidad de inicialización de HASHMAP sea demasiado alta o el factor de carga es demasiado bajo.
Clase de Deakhashmap
Deakhashmap es un hashmap mejorado que implementa una "referencia débil" a la clave.
Resumir
Si la pila, la cola y otras operaciones están involucradas, debe considerar el uso de elementos que deben ser insertados y eliminados rápidamente, debe usar LinkedList.
Si el programa se encuentra en un entorno único, o el acceso está solo en un hilo, considerando clases asíncronas, es más eficiente.
Preste especial atención a la operación de las tablas hash.
Intente devolver la interfaz en lugar del tipo real, como devolver una lista en lugar de una lista de matrices. Esto es para programación abstracta.
Sincronización
El vector es sincrónico. Algunos métodos en esta clase aseguran que los objetos en Vector sean seguros. ArrayList es asíncrono, por lo que los objetos en ArrayList no son seguros. Debido a que los requisitos de sincronización afectarán la eficiencia de la ejecución, el uso de ArrayList es una buena opción si no necesita colecciones seguras de hilo, lo que puede evitar la sobrecarga innecesaria de rendimiento debido a la sincronización.
Crecimiento de datos
Desde el mecanismo de implementación interna, ArrayList y Vector usan matrices (matriz) para controlar objetos en la colección. Cuando agrega elementos a estos dos tipos, si el número de elementos excede la longitud actual de la matriz interna, deben expandir la longitud de la matriz interna. El 50% original de eso, por lo que la última vez que obtenga esta colección siempre ocupará más espacio del que realmente necesita. Entonces, si desea guardar muchos datos en una colección, entonces hay algunas ventajas en el uso de Vector, porque puede evitar la sobrecarga de recursos innecesarios estableciendo el tamaño de inicialización de la colección.
Modo de uso
En ArrayList y Vector, lleva el mismo tiempo encontrar datos desde una ubicación especificada (a través del índice) o agregar y eliminar un elemento al final del conjunto. Sin embargo, si se agregan o eliminan elementos en otra parte del conjunto, el tiempo dedicado a crecer linealmente: O (Ni), donde N representa el número de elementos en el conjunto, y yo representa la posición del índice donde los elementos aumentan o eliminan elementos. ¿Por qué está sucediendo esto? Se cree que al realizar las operaciones anteriores, todos los elementos después de los elementos I-Th y I-Th en el conjunto deben realizar operaciones de desplazamiento. ¿Qué significa todo esto?
Esto significa que solo busca elementos en una posición específica o simplemente agregue y elimine elementos al final de la colección, luego usar vector o arraylist está bien. Si es otra operación, será mejor que elija otra clase de operación de colección. Por ejemplo, ¿el tiempo que lleva la clase de colección de LinkList agregar o eliminar elementos en cualquier posición de la colección es el mismo? es la ubicación del índice. Linklist también creará objetos para cada elemento insertado, y todo lo que necesita comprender también traerá una sobrecarga adicional.
Finalmente, en el libro Java práctico, Peter Haggar sugiere usar una matriz simple (matriz) en lugar de Vector o ArrayList. Esto es especialmente cierto para programas con alta eficiencia de ejecución. Debido a que el uso de matrices (matriz) evita la sincronización, las llamadas de métodos adicionales y la reasignación innecesaria de las operaciones espaciales.