El marco de recopilación de Java es un conjunto de clases e interfaces que implementan estructuras de datos de recopilación comúnmente reutilizables . [1]
Aunque se conoce como marco , funciona como una biblioteca . El marco de colecciones proporciona ambas interfaces que definen varias colecciones y clases que las implementan.
Diferencias de matrices
Las colecciones y las matrices son similares en el sentido de que ambas contienen referencias a objetos y se pueden administrar como un grupo. Sin embargo, a diferencia de las matrices, no es necesario asignar una determinada capacidad a las colecciones cuando se crean instancias. Las colecciones también pueden aumentar y reducir su tamaño automáticamente cuando se agregan o quitan objetos. Las colecciones no pueden contener elementos de tipo de datos básicos (tipos primitivos) como int, long o double; en su lugar, contienen clases de envoltura como Integer, Long o Double. [2]
Historia
Las implementaciones de colecciones en las versiones anteriores a JDK 1.2 de la plataforma Java incluían pocas clases de estructura de datos, pero no contenían un marco de colecciones. [3] Los métodos estándar para agrupar objetos Java fueron a través de la matriz, el Vector y las clases Hashtable, que desafortunadamente no fueron fáciles de extender y no implementaron una interfaz de miembro estándar. [4]
Para hacer frente a la necesidad de reunir reutilizables estructuras de datos , se han desarrollado varios marcos independientes, [3] siendo la más utilizada Doug Lea 's paquete de Colecciones , [5] y ObjectSpace Biblioteca genérica de Colección (JGL), [6] cuyo principal objetivo era la consistencia con la biblioteca de plantillas estándar de C ++ (STL). [7]
El marco de colecciones fue diseñado y desarrollado principalmente por Joshua Bloch , y se introdujo en JDK 1.2 . Reutilizó muchas ideas y clases del paquete Colecciones de Doug Lea , que quedó obsoleto como resultado. [5] Sun Microsystems decidió no utilizar las ideas de JGL, porque querían un marco compacto y la coherencia con C ++ no era uno de sus objetivos. [8]
Doug Lea luego desarrolló un paquete de simultaneidad , que comprende nuevas clases relacionadas con la colección. [9] Se incluyó una versión actualizada de estas utilidades de concurrencia en JDK 5.0 a partir de JSR 166 .
Arquitectura
Casi todas las colecciones en Java se derivan de la interfaz java.util.Collection. Colección define las partes básicas de todas las colecciones. La interfaz establece los métodos add () y remove () para agregar y eliminar de una colección, respectivamente. También se requiere el método toArray (), que convierte la colección en una matriz simple de todos los elementos de la colección. Finalmente, el método contains () comprueba si un elemento especificado está en la colección. La interfaz de la colección es una subinterfaz de java.lang.Iterable, por lo que cualquier colección puede ser el objetivo de una declaración para cada. (La interfaz Iterable proporciona el método iterator () utilizado por las declaraciones for-each.) Todas las colecciones tienen un iterador que pasa por todos los elementos de la colección. Además, Collection es genérico. Se puede escribir cualquier colección para almacenar cualquier clase. Por ejemplo, Collection
Tres tipos de colección
Hay tres tipos genéricos de colección: listas ordenadas, diccionarios / mapas y conjuntos.
Las listas ordenadas permiten al programador insertar elementos en un orden determinado y recuperar esos elementos en el mismo orden. Un ejemplo es una lista de espera. Las interfaces base para listas ordenadas se denominan Lista y Cola.
Los diccionarios / mapas almacenan referencias a objetos con una clave de búsqueda para acceder a los valores del objeto. Un ejemplo de llave es una tarjeta de identificación. La interfaz base para diccionarios / mapas se llama Map.
Los conjuntos son colecciones desordenadas que se pueden iterar y contienen cada elemento como máximo una vez. La interfaz básica de los conjuntos se llama Conjunto. [2]
Interfaz de lista
Las listas se implementan en el marco de colecciones a través de la interfaz java.util.List. Define una lista como esencialmente una versión más flexible de una matriz. Los elementos tienen un orden específico y se permiten elementos duplicados. Los elementos se pueden colocar en una posición específica. También se pueden buscar dentro de la lista. Dos ejemplos de clases concretas que implementan List son:
- java.util.ArrayList, que implementa la lista como una matriz. Siempre que se requieran funciones específicas de una lista, la clase mueve los elementos dentro de la matriz para hacerlo.
- java.util.LinkedList. Esta clase almacena los elementos en nodos, cada uno de los cuales tiene un puntero a los nodos anterior y siguiente de la lista. La lista se puede recorrer siguiendo los punteros, y se pueden agregar o eliminar elementos simplemente cambiando los punteros para colocar el nodo en su lugar apropiado. [11]
Clase de pila
Las pilas se crean utilizando java.util.Stack. La pila ofrece métodos para poner un nuevo objeto en la pila (método push ()) y para obtener objetos de la pila (método pop ()). Una pila devuelve el objeto de acuerdo con el último en entrar, primero en salir (LIFO), por ejemplo, el objeto que se colocó en último lugar en la pila se devuelve primero. java.util.Stack es una implementación estándar de una pila proporcionada por Java. La clase Stack representa una pila de objetos de último en entrar, primero en salir (LIFO). Extiende la clase java.util.Vector con cinco operaciones que permiten tratar un vector como una pila. Se proporcionan las operaciones habituales de empujar y sacar, así como un método para echar un vistazo al elemento superior de la pila, un método para probar si la pila está vacía y un método para buscar un elemento en la pila y descubrir qué tan lejos está. es de arriba. Cuando se crea una pila por primera vez, no contiene elementos.
Interfaces de cola
La interfaz java.util.Queue define la estructura de datos de la cola, que almacena elementos en el orden en que se insertan. Las nuevas incorporaciones van al final de la línea y los elementos se eliminan del frente. Crea un sistema primero en entrar, primero en salir. Esta interfaz está implementada por java.util.LinkedList, java.util.ArrayDeque y java.util.PriorityQueue. LinkedList, por supuesto, también implementa la interfaz List y también se puede usar como una. Pero también tiene los métodos Queue. ArrayDeque implementa la cola como una matriz. Tanto LinkedList como ArrayDeque también implementan la interfaz java.util.Deque, lo que le da más flexibilidad. [12]
java.util.Queue se puede utilizar de forma más flexible con su subinterfaz, java.util.concurrent.BlockingQueue. La interfaz BlockingQueue funciona como una cola normal, pero las adiciones y eliminaciones de la cola se bloquean. Si se llama a eliminar en una cola vacía, se puede configurar para que espere un tiempo especificado o indefinidamente hasta que aparezca un elemento en la cola. De manera similar, agregar un elemento está sujeto a una restricción de capacidad opcional en la cola, y el método puede esperar a que haya espacio disponible en la cola antes de regresar. [13]
java.util.PriorityQueue implementa java.util.Queue, pero también lo modifica. En lugar de ordenar los elementos en el orden en que se insertan, se ordenan por prioridad. El método utilizado para determinar la prioridad es el método compareTo () en los elementos o un método dado en el constructor. La clase crea esto usando un montón para mantener los elementos ordenados. [14]
Interfaces de cola de dos extremos (deque)
La interfaz java.util.Queue se expande mediante la subinterfaz java.util.Deque. Deque crea una cola de dos extremos. Mientras que una cola normal solo permite inserciones en la parte posterior y extracciones en la parte delantera, la deque permite que las inserciones o extracciones se realicen tanto en la parte delantera como en la trasera. Un deque es como una cola que se puede usar hacia adelante o hacia atrás, o ambos a la vez. Además, se pueden generar tanto un iterador hacia adelante como hacia atrás. La interfaz Deque está implementada por java.util.ArrayDeque y java.util.LinkedList. [15]
La interfaz java.util.concurrent.BlockingDeque funciona de manera similar a java.util.concurrent.BlockingQueue. Se proporcionan los mismos métodos de inserción y extracción con límites de tiempo para esperar a que la inserción o extracción sea posible. Sin embargo, la interfaz también proporciona la flexibilidad de un deque. Las inserciones y extracciones pueden realizarse en ambos extremos. La función de bloqueo se combina con la función deque. [dieciséis]
Establecer interfaces
La interfaz java.util.Set de Java define el conjunto. Un conjunto no puede tener elementos duplicados. Además, el conjunto no tiene un orden establecido. Como tal, los elementos no se pueden encontrar por índice. El conjunto se implementa mediante java.util.HashSet, java.util.LinkedHashSet y java.util.TreeSet. HashSet usa una tabla hash. Más específicamente, utiliza un java.util.HashMap para almacenar los hashes y elementos y para evitar duplicados. java.util.LinkedHashSet amplía esto creando una lista doblemente enlazada que enlaza todos los elementos por su orden de inserción. Esto asegura que el orden de iteración sobre el conjunto sea predecible. java.util.TreeSet usa un árbol rojo-negro implementado por un java.util.TreeMap. El árbol rojo-negro asegura que no haya duplicados. Además, permite a TreeSet implementar java.util.SortedSet. [17]
La interfaz java.util.Set se amplía mediante la interfaz java.util.SortedSet. A diferencia de un conjunto regular, los elementos de un conjunto ordenado se ordenan, ya sea por el método compareTo () del elemento o por un método proporcionado al constructor del conjunto ordenado. Se pueden recuperar los primeros y últimos elementos del conjunto ordenado, y se pueden crear subconjuntos mediante valores mínimos y máximos, así como el principio o el final al principio o al final del conjunto ordenado. La interfaz SortedSet está implementada por java.util.TreeSet. [18]
java.util.SortedSet se amplía aún más a través de la interfaz java.util.NavigableSet. Es similar a SortedSet, pero hay algunos métodos adicionales. Los métodos floor (), techo (), lower () y upper () encuentran un elemento en el conjunto que está cerca del parámetro. Además, se proporciona un iterador descendente sobre los elementos del conjunto. Al igual que con SortedSet, java.util.TreeSet implementa NavigableSet. [19]
Interfaces de mapas
Los mapas se definen mediante la interfaz java.util.Map en Java. Los mapas son estructuras de datos simples que asocian una clave con un elemento. Esto permite que el mapa sea muy flexible. Si la clave es el código hash del elemento, el mapa es esencialmente un conjunto. Si es solo un número creciente, se convierte en una lista. Los mapas son implementados por java.util.HashMap, java.util.LinkedHashMap y java.util.TreeMap. HashMap usa una tabla hash . Los hash de las claves se utilizan para encontrar los elementos en varios depósitos. LinkedHashMap amplía esto creando una lista doblemente enlazada entre los elementos, lo que permite acceder a ellos en el orden en que fueron insertados en el mapa. TreeMap, a diferencia de HashMap y LinkedHashMap, usa un árbol rojo-negro. Las claves se utilizan como valores para los nodos del árbol y los nodos apuntan a los elementos del mapa. [20]
La interfaz java.util.Map se amplía con su subinterfaz, java.util.SortedMap. Esta interfaz define un mapa que está ordenado por las claves proporcionadas. Utilizando, una vez más, el método compareTo () o un método proporcionado en el constructor para el mapa ordenado, los pares clave-elemento se ordenan por claves. Se puede llamar a la primera y última clave del mapa. Además, se pueden crear submapas a partir de claves mínimas y máximas. SortedMap es implementado por java.util.TreeMap. [21]
La interfaz java.util.NavigableMap extiende java.util.SortedMap de varias formas. Se pueden llamar métodos que busquen la clave o la entrada de mapa más cercana a la clave dada en cualquier dirección. El mapa también se puede invertir y a partir de él se puede generar un iterador en orden inverso. Está implementado por java.util.TreeMap. [22]
Extensiones al marco de colecciones de Java
El marco de las colecciones de Java se amplía con la biblioteca Apache Commons Collections, que agrega tipos de colecciones como una bolsa y un mapa bidireccional, así como utilidades para crear uniones e intersecciones. [23]
Google ha lanzado sus propias bibliotecas de colecciones como parte de las bibliotecas de guayaba .
Ver también
- Colección
- Envase
- Biblioteca de plantillas estándar
- Concurrencia de Java
- Java ConcurrentMap
Referencias
- ^ "Lección: Introducción a las colecciones" . Oracle Corporation . Consultado el 22 de diciembre de 2010 .
- ^ a b Horstmann, Cay (2014). Grandes objetos tempranos de Java .
- ^ a b "Marco de colecciones de Java" (PDF) . IBM . Archivado desde el original (PDF) el 7 de agosto de 2011.
- ^ Becker, Dan (1 de noviembre de 1998). "Empiece a utilizar Java Collections Framework" . JavaWorld . Consultado el 13 de julio de 2020 .
Antes de que Collections hiciera su debut más bienvenido, los métodos estándar para agrupar objetos Java eran a través de la matriz, Vector y Hashtable. Las tres colecciones tienen diferentes métodos y sintaxis para acceder a los miembros: las matrices usan los símbolos de corchetes ([]), Vector usa el método elementAt y Hashtable usa
get
yput
métodos. - ^ a b Lea, Doug . "Resumen del paquete de colecciones" . Consultado el 1 de enero de 2011 .
El Sun Java Development Kit JDK1.2 finalmente incluye un conjunto estándar de clases de colección. Si bien existen algunas diferencias de diseño e implementación, el paquete JDK1.2 contiene la mayoría de las mismas abstracciones básicas, estructura y funcionalidad que este paquete. Por esta razón, este paquete de colecciones NO se actualizará más.
- ^ "Biblioteca de colecciones genéricas para Java ™" . Consultado el 1 de enero de 2011 .
- ^ Vanhelsuwé, Laurence (1 de junio de 1997). "¿Necesita un buen conjunto de estructuras de datos abstractas? ¡El JGL de ObjectSpace tiene un gran impacto!" . JavaWorld . Consultado el 13 de julio de 2020 .
Al igual que con Java en sí, la biblioteca genérica de Java toma prestado mucho del campo de C ++: toma lo mejor del STL de C ++, mientras deja atrás las verrugas de C ++. La mayoría de los programadores de C ++ de hoy conocerán su STL, pero pocos están logrando explotar su potencial.
- ^ Vanhelsuwé, Laurence (1 de enero de 1999). "La batalla de los frameworks de contenedores: ¿cuál debería utilizar?" . JavaWorld . Consultado el 13 de julio de 2020 .
Comparar JGL de ObjectSpace Inc. y el marco de colecciones de Sun resulta ser como comparar manzanas y kiwis. A primera vista, los dos marcos parecen estar compitiendo por los mismos desarrolladores, pero después de una inspección más cercana, queda claro que los dos no se pueden comparar de manera justa sin reconocer primero que los dos marcos tienen objetivos diferentes. Si, como dice la documentación de Sun, Colecciones va a homogeneizar las propias API de Sun (API central, extensiones, etc.), entonces claramente Colecciones tiene que ser una gran noticia, y algo bueno, incluso para el adicto a JGL más fanático. Siempre que Sun no rompa su promesa en esta área, estaré feliz de invertir mis recursos en la adopción de Colecciones en serio.
- ^ Lea, Doug . "Descripción general del paquete util.concurrent Release 1.3.4" . Consultado el 1 de enero de 2011 .
Nota: Tras el lanzamiento de J2SE 5.0, este paquete entra en modo de mantenimiento: solo se publicarán las correcciones esenciales. El paquete J2SE5 java.util.concurrent incluye versiones mejoradas, más eficientes y estandarizadas de los componentes principales de este paquete.
- ^ "Iterable (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "Lista (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "Cola (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "BlockingQueue (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "PriorityQueue (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "Deque (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "BlockingDeque (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "Establecer (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "SortedSet (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "NavigableSet (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06.
- ^ "Mapa (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "SortedMap (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "NavigableMap (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 16 de agosto de 2013 .
- ^ "Colecciones - Inicio" . Commons.apache.org. 2013-07-04 . Consultado el 16 de agosto de 2013 .