La API de colección Java proporciona algunas clases e interfaces de columnas para ayudarnos a almacenar y administrar colecciones de objetos. De hecho, las colecciones en Java funcionan como una matriz, pero el tamaño de la colección se puede cambiar dinámicamente, y las colecciones también proporcionan funciones más avanzadas. Con la API de Javacollection, no necesitamos escribir clases de colección nosotros mismos. La mayoría de las clases de recolección de Java se encuentran en java.util , y algunas clases de recolección relacionadas con la concurrencia se encuentran en el paquete java.util.concurrent . Estas son algunas de las clases de colección proporcionadas por la API Java.
1. Descripción general de las colecciones de Java
Hay dos categorías de colecciones en Java, a saber:
1. Colección
2. Mapa
La colección de la clase de colección puede entenderse como almacenamiento principalmente de objetos individuales, mientras que la colección de la clase de mapas almacena principalmente objetos de valor clave. Estas dos categorías se pueden dar por sentado para corresponder a dos interfaces, a saber, Collection接口y Map接口. La siguiente imagen enumera el árbol de herencia de estas dos interfaces:
De la imagen de arriba, podemos ver que la interfaz de colección ha derivado tres ramas, a saber:
1. Lista
2. Establecer
3. Cola
El mapa es relativamente simple, con solo una rama. A continuación presentaremos cada clase de implementación de la colección Java en detalle.
Nota: Para distinguir la recolección y las colecciones, las colecciones son una interfaz para la colección, y las colecciones es una clase de herramientas, que proporciona algunos métodos estáticos para facilitarnos que operemos instancias de recolección, las cuales se encuentran en el paquete java.util .
2. Primero introduzca de la interfaz de colección
La siguiente figura es una captura de pantalla del código fuente de la interfaz de recopilación. De los métodos abstractos en la interfaz, podemos ver que define un método común para una colección general:
- Agregar y eliminar un elemento
- Determinar si el elemento existe
- Obtener el tamaño de la colección
- iterar sobre una colección
2.1 Interfaz de la lista de la colección
La interfaz de la lista hereda de la interfaz de colección. Su característica es que se ordenan los objetos en él y cada objeto tiene un índice único. Podemos buscar un elemento a través de este índice, y los objetos en la lista pueden repetirse, que es similar a una matriz. Para la interfaz de lista, la API Java proporciona la siguiente implementación:
- java.util.arraylist
- java.util.linkedlist
- java.util.vector
- java.util.stack
Por supuesto, hay algunas implementaciones en el paquete java.util.concurrent , que se describirá en detalle en otro artículo.
ArrayList es la colección más utilizada, y su implementación interna es una matriz , y el tamaño de ArrayList puede expandirse dinámicamente. La eficiencia de acceso aleatorio para los elementos es alta, y la complejidad del tiempo del acceso es O(1) . La eficiencia de operación de la cola es alta, y la complejidad del tiempo es O(1) al igual que el acceso aleatorio. Si se opera desde la cabeza, la eficiencia será relativamente baja, porque al insertar o eliminar desde la cabeza, todos los siguientes elementos deben moverse, y la complejidad del tiempo es O(ni) (n representa el número de elementos, y yo representa la posición del elemento).
LinkList: como se puede ver en la figura anterior, no solo hereda la interfaz List , sino que también hereda la interfaz Deque (se introducirá más adelante). Linklist es una estructura de datos basada en una lista vinculada, y cada nodo guarda punteros a los nodos anteriores y siguientes. Linklist es relativamente ineficiente para el acceso aleatorio porque requiere indexación desde cero, por lo que su complejidad de tiempo es O(i) . Sin embargo, para la adición y eliminación de elementos, LinkList es eficiente porque solo los punteros delanteros y traseros deben modificarse, y su complejidad de tiempo es O(1) .
Vector: desde las capturas de pantalla del código fuente Vector y ArrayList, heredan las interfaces exactamente igual. Por lo tanto, Vector puede considerarse como una lista de matrices segura a hilo, que también se implementa en función de las matrices , pero casi todas las operaciones de recolección se agregan con la palabra clave synchronized .
Pila: lo anterior es una captura de pantalla del código fuente de la clase de pila. Vemos que la clase de pila realmente hereda de Vector. Stack solo agrega varios métodos basados en Vector para proporcionar las características de la pila (último en LIFO en primer lugar). La característica de Stack es que cuando se agregan, se agregarán nuevos elementos a la parte superior, y cuando se eliminen, los elementos superiores se eliminarán primero. Esta estructura de datos se usa principalmente como algunos procesos especiales de procesamiento de datos, como compilación de idiomas, análisis XML, etc.
2.2 COLECCIÓN SET Interfaz
Las interfaces establecidas y de lista también se heredan de la interfaz Collection , y también son una implementación de colecciones. La mayor diferencia entre ellos es que los objetos en SET no pueden repetirse . Para las interfaces Set , la API Java proporciona la siguiente implementación:
- java.util.enumset
- java.util.hashset
- java.util.linkedhashset
- java.util.treeset
Las funciones de estas clases son ligeramente diferentes, y las diferencias se reflejan principalmente en el orden de la iteración de objetos y la eficiencia de la inserción y la búsqueda.
La implementación de hashset es muy simple, y es un HashMap en el interior, pero no garantiza el orden de los elementos.
La implementación de Linkedhashset también es muy simple, y utiliza un LinkedHashMap internamente. Debido a que LinkedHashMap mantiene una lista bidireccional vinculada internamente para mantener el orden, la característica de LinkedHashSet es que se ordenan los elementos en ella, y el orden de la iteración de elementos es el orden de su inserción. La reinserción de elementos no afectará el orden de los elementos originales.
TreeSet: a partir de la relación de herencia en la figura anterior, primero debe comprender NavigableSet TreeSet SortedSet .
Interfaz sortedset
Public Interface SortedSet <E> extiende el conjunto <E> {comparador <? Super E> Comparator (); Subconjunto SortedSet <E> (E desde elemento, E Toelement); Sortedset <E> auriculares (e toelement); Sortedset <E> Tailset (e fromelement); E primero (); } Desde la definición de interfaz anterior, la interfaz SortedSet es una subinterfaz del conjunto. Además de las características del conjunto general, sus elementos se ordenan internamente. El orden de los elementos internos depende de las reglas de pedido de los elementos, es decir, el orden de los elementos depende de la implementación de la interfaz comparable del elemento o un comparator de comparación. Para obtener la diferencia entre comparable y comparador, consulte: https://www.vevb.com/article/93973.htm
Interfaz navegable
La interfaz pública navegables <e> extiende SortedSet <E> {NavigableSet <E> DescendingSet (); Iterador <E> DescendendIterator (); Sortedset <E> auriculares (e toelement); Sortedset <E> Tailset (e fromelement); Subconjunto SortedSet <E> (E desde elemento, E Toelement); techo (), piso (), mayor () y menor () ...}Desde la definición de la interfaz de navegación, es una subinterfaz de SortedSet y proporciona algunos métodos de navegación. En cuanto al significado de estos métodos de navegación, puede consultar Java DOC.
Por lo tanto, la característica de TreeSet es que se ordenan sus elementos internos y hay muchos métodos de navegación para implementar. Desde la primera parte de la descripción general de la clase Java Collection, sabemos que SET tiene una subinterfaz SortedSet , y SortedSet tiene una interfaz Sub-Interface NavigableSet . La API Java solo implementa interfaces SortedSet y NavigableSet, que es TreeSet .
Interfaz de la cola de 2.3 colección
La interfaz de la cola hereda de la interfaz Collection , que también representa una cola ordenada. Sin embargo, la característica más importante de esta cola es que el elemento recién insertado se encuentra en la cola de la cola y el objeto eliminado se encuentra en la cabeza de la cola, que es similar a la cola que se verifica en el supermercado.
Ya sabemos por la descripción general de la colección Java en la Sección 1 que la interfaz de la cola también tiene una subinterfaz deque. Echemos un vistazo a la definición de estas dos interfaces por la API Java:
Interfaz de cola:
La cola de interfaz pública <E> extiende la colección <E> {boolean add (e e); oferta booleana (e e); E eliminar (); E encuesta (); E peek ();}Interfaz Deque:
La interfaz pública deque <e> extiende la cola <E> {void addfirst (e e); Vacío Addlast (E E); E removeFirst (); E removeFirst ();}A partir de las definiciones de estas dos interfaces, creo que todos han visto algunas pistas. La interfaz de la cola define el método de operación de una cola general, mientras que Deque es una cola de doble extremo .
Para las interfaces Queue , la API Java proporciona dos implementaciones:
- java.util.linkedlist (también implementa la interfaz deque)
- java.util.priorityqueue
LinkedList: el capítulo de la lista anterior ha mencionado que es una cola estándar.
Priorityqueue: el orden en la cola es similar al TreeSet, dependiendo de las reglas de pedido de los elementos, es decir, la implementación de los elementos a la interfaz comparable o un comparador de comparación.
Para la interfaz Deque, hay otra implementación además de la clase LinkList:
- java.util.arraydeque
Arraydeque: como se puede ver del nombre, su implementación interna es una matriz.
3. Mapa de colección de Java
Desde la primera parte de la descripción general de la clase de colección Java, sabemos que MAP no hereda de la interfaz de colección, sino que se encuentra en una posición paralela con la interfaz de colección. Por lo tanto, el comportamiento del mapa es muy diferente del comportamiento de la colección introducida anteriormente. La característica principal del mapa es que los elementos que almacena son pares key-value . Echemos un vistazo a la definición de la interfaz del mapa:
mapa de interfaz pública <k, v> {v put (k key, valor v); boolean contiene key (clave de objeto); Set <map.entry <k, v >> entrySet (); int hashcode (); V Get (clave de objeto); Establecer <K> keySet (); ...}Para las interfaces de mapas, la API Java proporciona las siguientes implementaciones:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- java.util.ididentityhashmap
- java.util.linkedhashmap
- java.util.properties
- java.util.treemap
- java.util.weakhashmap
Entre ellos, los más utilizados son HashMap y Treemap.
La clave y el valor en el hashmap son desordenados. Vale la pena estudiar la implementación interna de HashMap. Para más detalles, consulte la implementación interna de HashMap
Hashtable puede considerarse como una implementación de peso pesado de HashMap. La mayoría de los métodos se agregan con la palabra clave sincronizada, que es segura de hilo. Otra diferencia entre HashTable y Hashmap es que key-value de Hashmap pueden ser nulos, mientras que HashTable不.
Linkedhashmap también es un hashmap, pero una lista vinculada de dos vías se mantiene internamente para mantener el orden. La implementación interna LinkedHashSet se utiliza para usar LinkedHashMap.
La clave y el valor en Treemap no solo pueden mantener el orden, sino que son similares a TreeSet y PriorityQueue . El orden iterativo de clave y valor en Treemap depende de sus respectivas reglas de clasificación.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.