Marco de colecciones de Java
Mucho antes de Java 2, Java ya proporcionaba clases especiales (ad hoc). Por ejemplo: Dictionary, Vector, Stack y Properties. Estas clases se usaban para almacenar y manipular grupos de objetos.
Aunque estas clases eran muy útiles, carecían de un tema central y unificado. Por esta razón, la forma de usar la clase Vector era muy diferente de la forma de usar la clase Properties.
El marco de colecciones fue diseñado para cumplir los siguientes objetivos.
-
El marco debe ser de alto rendimiento. Las implementaciones de las colecciones básicas (arrays dinámicos, listas enlazadas, árboles, tablas hash) también deben ser eficientes.
-
El marco permite que diferentes tipos de colecciones funcionen de manera similar, con un alto grado de interoperabilidad.
-
La extensión y adaptación de una colección debe ser sencilla.
Para ello, todo el marco de colecciones se diseñó en torno a un conjunto de interfaces estándar. Puedes usar directamente las implementaciones estándar de estas interfaces, como por ejemplo:LinkedList, HashSet, yTreeSetetc. Además, también puedes implementar tus propias colecciones a través de estas interfaces.

Como se puede ver en el diagrama del marco de colecciones anterior, el marco de colecciones de Java incluye principalmente dos tipos de contenedores: uno es Collection, que almacena un conjunto de elementos, y el otro es Map, que almacena asignaciones de clave/valor. La interfaz Collection tiene a su vez 3 subtipos: List, Set y Queue. Después hay algunas clases abstractas y, finalmente, las clases de implementación concretas. Las de uso común sonArrayList、LinkedList、HashSet、LinkedHashSet, HashMap, LinkedHashMap, etc.
El marco de colecciones es una arquitectura unificada para representar y manipular colecciones. Todos los marcos de colecciones incluyen lo siguiente:
-
Interfaces:
Son tipos de datos abstractos que representan colecciones. Por ejemplo: Collection, List, Set, Map, etc. La razón por la que se definen múltiples interfaces es para poder operar con los objetos de colección de diferentes maneras. -
Implementaciones (clases):Son implementaciones concretas de las interfaces de colección. En esencia, son estructuras de datos reutilizables, por ejemplo: ArrayList, LinkedList, HashSet, HashMap.
-
Algoritmos:Son cálculos útiles ejecutados por métodos en objetos que implementan interfaces de colección, por ejemplo: búsqueda y ordenación. Estos algoritmos implementan polimorfismo, porque el mismo método puede tener diferentes implementaciones en interfaces similares.
Además de las colecciones, el marco también define varias interfaces y clases Map. Map almacena pares clave/valor. Aunque Map no es una colección, están totalmente integrados en las colecciones.
La arquitectura del marco de colecciones se muestra en la siguiente figura

El marco de colecciones de Java proporciona un conjunto de interfaces y clases de alto rendimiento y fáciles de usar. El marco de colecciones de Java se encuentra en el paquete java.util, por lo que al usarlo se debe importar el paquete.
Interfaces de colección
El marco de colecciones define algunas interfaces. Esta sección ofrece una descripción general de cada interfaz:
| N.º | Descripción de la interfaz |
|---|---|
| 1 | Interfaz Collection Collection es la interfaz de colección más básica. Una Collection representa un grupo de objetos, es decir, los elementos de la Collection. Java no proporciona clases que hereden directamente de Collection, solo proporciona subinterfaces que heredan de ella (como List y Set). La interfaz Collection almacena un grupo de objetos no únicos y desordenados. |
| 2 | Interfaz List La interfaz List es una Collection ordenada. Con esta interfaz se puede controlar con precisión la posición de inserción de cada elemento. Se puede acceder a los elementos de la List mediante un índice (la posición del elemento en la List, similar al subíndice de un array). El índice del primer elemento es 0 y se permiten elementos duplicados. La interfaz List almacena un grupo de objetos no únicos y ordenados (orden de inserción). |
| 3 | Set Set tiene exactamente la misma interfaz que Collection, solo que su comportamiento es diferente: Set no almacena elementos duplicados. La interfaz Set almacena un grupo de objetos únicos y desordenados. |
| 4 | SortedSet Hereda de Set y almacena colecciones ordenadas. |
| 5 | Map La interfaz Map almacena un grupo de objetos de pares clave-valor y proporciona la asignación de clave (key) a valor (value). |
| 6 | Map.Entry Describe un elemento (par clave/valor) en un Map. Es una interfaz interna de Map. |
| 7 | SortedMap Hereda de Map y mantiene las claves en orden ascendente. |
| 8 | Enumeration Esta es una interfaz tradicional y define métodos mediante los cuales se pueden enumerar (obtener uno a la vez) los elementos de una colección de objetos. Esta interfaz tradicional ha sido reemplazada por los iteradores. |
Diferencias entre Set y List
-
1. Las instancias de la interfaz Set almacenan datos desordenados y no duplicados. Las instancias de la interfaz List almacenan elementos ordenados y duplicables.
2. En Set, la eficiencia de búsqueda es baja, pero la de eliminación e inserción es alta; la inserción y eliminación no provocan cambios en la posición de los elementos.<Las clases de implementación incluyen HashSet, TreeSet>。
3. List es similar a un array; puede crecer dinámicamente y su longitud aumenta automáticamente según la longitud de los datos realmente almacenados. La eficiencia de búsqueda de elementos es alta, pero la de inserción y eliminación es baja, porque provoca cambios en la posición de otros elementos.<Las clases de implementación incluyen ArrayList, LinkedList, Vector> 。
Clases de implementación de colecciones (clases de colección)
Java proporciona un conjunto de clases de colección estándar que implementan la interfaz Collection. Algunas de ellas son clases concretas que se pueden usar directamente, mientras que otras son clases abstractas que proporcionan implementaciones parciales de la interfaz.
Las clases de colección estándar se resumen en la siguiente tabla:
| N.º | Descripción de la clase |
|---|---|
| 1 | AbstractCollection Implementa la mayoría de las interfaces de colección. |
| 2 | AbstractList Hereda de AbstractCollection e implementa la mayor parte de la interfaz List. |
| 3 | AbstractSequentialList Hereda de AbstractList y proporciona acceso en cadena (enlazado) a los elementos de datos en lugar de acceso aleatorio. |
| 4 | LinkedList Esta clase implementa la interfaz List y permite elementos null (nulos). Se utiliza principalmente para crear estructuras de datos de listas enlazadas. Esta clase no tiene métodos sincronizados. Si varios subprocesos acceden a una List simultáneamente, debes implementar la sincronización de acceso por tu cuenta. La solución es construir una List sincronizada al crear la List. Por ejemplo: List list=Collections.synchronizedList(newLinkedList(...)); LinkedList tiene baja eficiencia de búsqueda. |
| 5 | ArrayList Esta clase también implementa la interfaz List, implementa arrays de tamaño variable y ofrece mejor rendimiento en el acceso aleatorio y la iteración de elementos. Esta clase tampoco está sincronizada; no la uses en entornos de subprocesos múltiples. ArrayList aumenta su longitud actual en un 50% y la inserción y eliminación tienen baja eficiencia. |
| 6 | AbstractSet Hereda de AbstractCollection e implementa la mayor parte de la interfaz Set. |
| 7 | HashSet Esta clase implementa la interfaz Set, no permite elementos duplicados, no garantiza el orden de los elementos del conjunto y permite elementos con valor null, pero como máximo uno. |
| 8 | LinkedHashSet Con un orden de iteración predecible,Setimplementación de tabla hash y lista enlazada de la interfaz. |
| 9 | TreeSet Esta clase implementa la interfaz Set y puede realizar funciones como la ordenación. |
| 10 | AbstractMap Implementa la mayor parte de la interfaz Map. |
| 11 | HashMap
HashMap es una tabla hash; su contenido almacena asignaciones de pares clave-valor. Esta clase implementa la interfaz Map, almacena datos según el valor HashCode de la clave, tiene una velocidad de acceso muy rápida, permite como máximo que la clave de un registro sea null y no admite sincronización de subprocesos. |
| 12 | TreeMap
Hereda de AbstractMap y utiliza un árbol. |
| 13 | WeakHashMap
Hereda de la clase AbstractMap y usa una tabla hash con claves débiles. |
| 14 | LinkedHashMap
Hereda de HashMap y ordena los elementos según su orden natural. |
| 15 | IdentityHashMap
Hereda de la clase AbstractMap y utiliza la igualdad por referencia al comparar claves y valores. |
En el tutorial anterior ya se han discutido las clases definidas en el paquete java.util, como se muestra a continuación:
| N.º | Descripción de la clase |
|---|---|
| 1 | Vector
Esta clase es muy similar a ArrayList, pero está sincronizada y puede usarse en entornos de subprocesos múltiples. Esta clase permite establecer la longitud de crecimiento predeterminada; la forma de expansión predeterminada es el doble de la original. |
| 2 | Stack
Stack es una subclase de Vector e implementa una pila estándar de último en entrar, primero en salir (LIFO). |
| 3 | Dictionary
La clase Dictionary es una clase abstracta que se utiliza para almacenar pares clave/valor; su función es similar a la clase Map. |
| 4 | Hashtable
Hashtable es una subclase de la clase Dictionary (diccionario) y se encuentra en el paquete java.util. |
| 5 | Properties
Properties hereda de Hashtable y representa un conjunto de propiedades persistente. En la lista de propiedades, cada clave y su valor correspondiente son una cadena. |
| 6 | BitSet La clase BitSet crea un tipo especial de array para almacenar valores de bits. El tamaño del array en BitSet aumenta según sea necesario. |
Algoritmos de colecciones
El marco de colecciones define varios algoritmos que pueden usarse en colecciones y mapas. Estos algoritmos se definen como métodos estáticos de las clases de colección.
Al intentar comparar tipos incompatibles, algunos métodos pueden lanzar una excepción ClassCastException. Cuando se intenta modificar una colección no modificable, se lanza una excepción UnsupportedOperationException.
La colección define tres variables estáticas: EMPTY_SET, EMPTY_LIST, EMPTY_MAP. Estas variables son inmutables.
| No. | Descripción del algoritmo |
|---|---|
| 1 |
Algoritmos de colecciones (Collection Algorithms) Aquí hay una lista de todas las implementaciones de algoritmos. |
Cómo usar iteradores
Normalmente, querrás recorrer los elementos de una colección. Por ejemplo, mostrar cada elemento de la colección.
Generalmente, para recorrer arrays se usan el bucle for o el for mejorado; estos dos métodos también se pueden usar en el framework de colecciones, pero hay otro método que consiste en usar un iterador para recorrer el framework de colecciones. Es un objeto que implementaIteratorla interfaz Iterator o la interfaz ListIterator.
Los iteradores te permiten obtener o eliminar elementos de una colección mediante bucles. ListIterator hereda de Iterator para permitir el recorrido bidireccional de listas y la modificación de elementos.
| No. | Descripción de los métodos del iterador |
|---|---|
| 1 |
Uso de Java Iterator Aquí se enumeran, mediante ejemplos, todos los métodos proporcionados por las interfaces Iterator y ListIterator. |
Recorrer ArrayList
Ejemplo
Análisis:
Los tres métodos se usan para recorrer la colección ArrayList; el tercer método utiliza un iterador, y con este método no hay que preocuparse por exceder la longitud de la colección durante el recorrido.
Recorrer Map
Ejemplo
Cómo usar comparadores
TreeSet y TreeMap almacenan elementos en orden de clasificación. Sin embargo, es a través del comparador que se define con precisión qué orden de clasificación se sigue.
Esta interfaz nos permite ordenar una colección de diferentes maneras.
| No. | Descripción de los métodos del comparador |
|---|---|
| 1 | Uso de Java Comparator Aquí se enumeran, mediante ejemplos, todos los métodos proporcionados por la interfaz Comparator. |
Resumen
El framework de colecciones de Java proporciona a los programadores estructuras de datos y algoritmos preempaquetados para manipularlos.
Una colección es un objeto que puede contener referencias a otros objetos. La interfaz Collection declara las operaciones que se pueden realizar sobre cada tipo de colección.
Las clases e interfaces del framework de colecciones están en el paquete java.util.
Cualquier objeto que se añade a una clase de colección se convierte automáticamente al tipo Object, por lo que al extraerlo es necesario realizar una conversión de tipos forzada.
Otras extensiones