Articulo de referencia

Marco de colecciones de Java

Jerarquía de clases e interfaces del marco de colecciones de Java, excluyendo los tipos del paquete java.util.concurrent y algunas otras clases. El marco de colecciones de Java ...

Diagrama de la jerarquía de clases e interfaces del framework de colecciones de Java.
Jerarquía de clases e interfaces del marco de colecciones de Java, excluyendo los tipos del paquete java.util.concurrent y algunas otras clases.

El marco de colecciones de Java es un conjunto de clases e interfaces que implementan estructuras de datos de colección ( colecciones ) reutilizables de uso común. [ 1 ]

Aunque se le denomina marco de trabajo , funciona como una biblioteca . El marco de colecciones proporciona tanto interfaces que definen diversas colecciones como clases que las implementan.

Diferencias con los arreglos

CollectionLas cadenas y los arreglos son similares en que ambos contienen referencias a objetos y se pueden administrar como un grupo. Sin embargo, a diferencia de los arreglos, Collectionlas cadenas no necesitan que se les asigne una capacidad determinada al instanciarse. CollectionPueden aumentar o disminuir de tamaño automáticamente cuando se agregan o eliminan objetos.

Collections no puede contener tipos de datos primitivos como int, long, o double. [ 2 ] En cambio, Collections puede contener clases envoltorio como java.lang.Integer, java.lang.Long, o java.lang.Double. [ 3 ]

CollectionLos objetos genéricos son invariantes, pero los arrays son covariantes . Esto puede considerarse una ventaja de los objetos genéricos en Collectioncomparación con los arrays, porque en ciertas circunstancias, usar el genérico Collectionen lugar de un array evita excepciones en tiempo de ejecución al lanzar una excepción en tiempo de compilación para informar al desarrollador que corrija el código. Por ejemplo, si un desarrollador declara un Object[]objeto y le asigna el Object[]valor devuelto por una nueva Long[]instancia con una cierta capacidad, no se lanzará ninguna excepción en tiempo de compilación. Si el desarrollador intenta agregar un Stringa este Long[]objeto, el programa Java lanzará una excepción ArrayStoreException. Por otro lado, si el desarrollador declara una nueva instancia de Collection<Object>como ArrayList<Long>, el compilador de Java lanzará (correctamente) una excepción en tiempo de compilación para indicar que el código está escrito con un tipo incompatible e incorrecto, evitando así cualquier posible excepción en tiempo de ejecución. El desarrollador puede corregir el código instanciando Collection<Object>como un ArrayList<Object>objeto. Si el código usa Java SE7 o versiones posteriores, el desarrollador puede instanciar Collection<Object>como un ArrayList<>objeto usando el operador diamante [ 2 ].

CollectionLos s son genéricos y por lo tanto reificados , pero los arreglos no están reificados. [ 2 ]

Historia

Las implementaciones de colecciones en las versiones anteriores a JDK 1.2 de la plataforma Java incluían pocas clases de estructuras de datos, pero no contenían un marco de colecciones. [ 4 ] Los métodos estándar para agrupar objetos Java eran a través de las clases array, Vectory Hashtable, que desafortunadamente no eran fáciles de extender y no implementaban una interfaz de miembro estándar. [ 5 ]

Para abordar la necesidad de estructuras de datos de colección reutilizables , se desarrollaron varios marcos independientes, [ 4 ] siendo el más utilizado el paquete Collections de Doug Lea , [ 6 ] y ObjectSpace Generic Collection Library (JGL), [ 7 ] cuyo objetivo principal era la coherencia con la Standard Template Library (STL) de C++ . [ 8 ]

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 Collections de Doug Lea , que fue descontinuado como resultado. [ 6 ] Sun Microsystems optó por no utilizar las ideas de JGL, porque buscaban un marco compacto y la coherencia con C++ no era uno de sus objetivos. [ 9 ]

Doug Lea desarrolló posteriormente un paquete de concurrencia , que comprende nuevas clases relacionadas con Collection. [ 10 ] Una versión actualizada de estas utilidades de concurrencia se incluyó en JDK 5.0 a partir de JSR 166 .

Arquitectura

La mayoría de las colecciones en Java que no son mapas se derivan de la java.util.Collectioninterfaz. Collectiondefine las partes básicas de todas las colecciones.

La interfaz tiene los métodos add(E e)y remove(E e)para agregar y eliminar de un Collectionrespectivamente. También tiene el toArray()método, que convierte el Collectionen una matriz de Objecten el Collection(con tipo de retorno de Object[]). [ 11 ] Finalmente, el contains(E e)método comprueba si existe un elemento especificado en el Collection.

La Collectioninterfaz es una subinterfaz de java.lang.Iterable, por lo que cualquier Collectionpuede ser el objetivo de una instrucción for-each . (La Iterableinterfaz proporciona el iterator()método utilizado por las instrucciones for-each). Todos Collectionlos implementan java.util.Iteratorpara escanear todos los elementos en el Collection.

Collectiones genérico. Cualquiera Collectionpuede almacenar cualquier Object. Por ejemplo, cualquier implementación de Collection<String>contiene Stringobjetos. No se requiere conversión de tipo al usar los Stringobjetos de una implementación de Collection<String>. [ 12 ] Tenga en cuenta que los corchetes angulares < >pueden contener un argumento de tipo que especifica qué tipo Collectioncontiene. [ 13 ]

Marco de colección

Collection Framework simplemente contiene todas las colecciones (concepto general) como listas, etc., que siguen la interfaz de colección.

Tipos de colección

Hay varios tipos de colecciones: colas , mapas , listas y conjuntos .

Las colas permiten al programador insertar elementos en un orden determinado y recuperarlos en el mismo orden. Un ejemplo es una lista de espera. Las interfaces básicas para las colas se denominan Queue.

Los diccionarios/mapas almacenan referencias a objetos con una clave de búsqueda para acceder a los valores del objeto. Un ejemplo de clave es una tarjeta de identificación. La interfaz base para diccionarios/mapas se llama Map.

Las listas son colecciones finitas donde se puede almacenar el mismo valor varias veces.

Los conjuntos son colecciones no ordenadas que se pueden iterar y contienen cada elemento como máximo una vez. La interfaz base para conjuntos se llama Set. [ 3 ]

Interfaz de lista

Las listas se implementan en el marco de colecciones mediante una java.util.Listinterfaz. Esta interfaz define una lista como una versión más flexible de un array. Los elementos tienen un orden específico y se permiten elementos duplicados. Los elementos se pueden colocar en una posición específica y también se pueden buscar dentro de la lista.

Lista de implementaciones

Hay varias clases concretas que implementan List, incluyendo y todas sus subclases correspondientes, así como .AbstractListCopyOnWriteArrayList

Clase AbstractList

Las subclases directas de la clase incluyen , y .AbstractListAbstractSequentialListArrayListVector

AbstractListes un ejemplo de una implementación esquelética , que aprovecha y combina las ventajas de las interfaces y las clases abstractas al facilitar al desarrollador la creación de su propia implementación para la interfaz dada. [ 14 ]

Clase ArrayList

La java.util.ArrayListclase implementa la estructura Listcomo un array. Cuando se requieren funciones específicas de un array List, la clase reorganiza los elementos dentro del array para poder realizarlas.

Clase Lista Enlazada

La java.util.LinkedListclase almacena los elementos en nodos que tienen cada uno un puntero al nodo anterior y siguiente en la estructura List. La Listestructura se puede recorrer siguiendo los punteros, y los elementos se pueden agregar o eliminar simplemente cambiando los punteros para colocar el nodo en su lugar correcto. [ 15 ]

Clase Vector

La clase tiene como subclase directa. Este es un ejemplo de violación del principio de composición sobre herencia en las bibliotecas de la plataforma Java, ya que en informática , un vector generalmente no es una pila . [ 16 ] La composición habría sido más apropiada en este caso. [ 16 ]VectorStack

Clase Pila

La clase con cinco operaciones que permiten que un sea tratado como un . Las pilas se crean usando . El ofrece métodos para poner un nuevo objeto en el (método ) y para obtener objetos del (método ). Un devuelve el objeto según el último en entrar, primero en salir (LIFO), es decir, el objeto que se colocó más tarde en el se devuelve primero. es una implementación estándar de una pila proporcionada por Java.Stackextendsjava.util.VectorVectorStackjava.util.StackStackStackpush(E e)Stackpop()StackStackjava.util.Stack

La Stackclase representa una pila de objetos de tipo último en entrar, primero en salir (LIFO). La clase Stack tiene cinco operaciones adicionales que permiten Vectortratar una pila como una lista Stack. Se proporcionan las operaciones habituales push(E e)de búsqueda y eliminación pop(), así como un método peek()para ver el elemento superior de la lista Stack, un método para comprobar si la lista Stackestá vacía empty()y un método para buscar Stackun elemento en la lista y descubrir a qué distancia se encuentra de la parte superior search(Object o). Cuando Stackse crea una pila por primera vez, no contiene ningún elemento.

Clase CopyOnWriteArrayList

Extiende CopyOnWriteArrayListla Objectclase y no extiende ninguna otra clase. CopyOnWriteArrayListPermite la seguridad de subprocesos sin realizar una sincronización excesiva. [ 17 ]

CopyOnWriteArrayListEn algunos casos, la sincronización es obligatoria. Por ejemplo, si un método modifica un campo estático y debe ser llamado por múltiples hilos, entonces la sincronización es obligatoria y no se deben usar utilidades de concurrencia como [ 17 ] .

Sin embargo, la sincronización puede generar una sobrecarga de rendimiento. Para escenarios donde la sincronización no es obligatoria, CopyOnWriteArrayListexiste una alternativa viable y segura para subprocesos que aprovecha los procesadores multinúcleo y resulta en una mayor utilización de la CPU . [ 17 ]

Interfaces de cola

La java.util.Queueinterfaz define la estructura de datos de la cola, que almacena los elementos en el orden en que se insertan. Las nuevas adiciones van al final de la cola y los elementos se eliminan del principio. Crea un sistema FIFO (primero en entrar, primero en salir) . Esta interfaz es implementada por java.util.LinkedList, java.util.ArrayDeque, y java.util.PriorityQueue.

Implementaciones de colas

Clase AbstractQueue

Las subclases directas de la clase incluyen , , , , . y .AbstractQueueArrayBlockingQueueConcurrentLinkedQueueDelayeQueueLinkedBlockingDequeLinkedBlockingQueueLinkedTransferQueuePriorityBlockingQueue

Tenga en cuenta que tanto como extienden pero no extienden ninguna otra clase abstracta como .ArrayDequeConcurrentLinkedDequeAbstractCollectionAbstractQueue

AbstractQueuees un ejemplo de una implementación esquelética .

Clase Cola de prioridad

La java.util.PriorityQueueclase implementa java.util.Queue, pero también la modifica. [ 18 ]PriorityQueue tiene un comparator()método adicional. [ 18 ] En lugar de que los elementos se ordenen en el orden en que se insertan, se ordenan por prioridad. El método utilizado para determinar la prioridad es el java.lang.Comparable#compareTo(T)método en los elementos, o un método dado en el constructor. La clase crea esto usando un montón para mantener los elementos ordenados. [ 19 ]

Clase ConcurrentLinkedQueue

La java.util.concurrent.ConcurrentLinkedQueueclase extiende . implementa la interfaz. [ 20 ]java.util.AbstractQueueConcurrentLinkedQueuejava.util.Queue

La ConcurrentLinkedQueueclase es una colección segura para subprocesos, ya que para cualquier elemento colocado dentro de una colección , la biblioteca de colecciones de Java garantiza que el elemento se publique de forma segura al permitir que cualquier subproceso obtenga el elemento de la colección. [ 21 ] Se dice que un objeto se publica de forma segura si el estado del objeto se hace visible para todos los demás subprocesos en el mismo momento. [ 21 ] La publicación segura generalmente requiere la sincronización de los subprocesos que publican y consumen. [ 21 ]ConcurrentLinkedQueue

Interfaz de cola de bloqueo

La java.util.concurrent.BlockingQueueinterfaz se extiende Queue. [ 20 ]

La interfaz tiene las siguientes subinterfaces directas: y . funciona como una regular , pero las adiciones y eliminaciones de son bloqueantes. [ 22 ] Si se llama en una vacía , se puede configurar para esperar un tiempo específico o indefinidamente a que aparezca un elemento en la . De manera similar, agregar un elemento usando el método está sujeto a una restricción de capacidad opcional en la , y el método puede esperar a que haya espacio disponible en la antes de devolver. La interfaz introduce un método que elimina y obtiene la cabeza de la , y espera hasta que la ya no esté vacía si es necesario. [ 23 ] [ 24 ]BlockingQueueBlockingDequeTransferQueueBlockingQueueQueueBlockingQueueremove(Object o)BlockingQueueBlockingQueueadd(Object o)BlockingQueueBlockingQueueBlockingQueuetake()BlockingQueueBlockingQueue

Interfaces de cola de doble extremo ( Deque )

La interfaz extiende la interfaz. [ 25 ] crea una cola de doble extremo. Mientras que una cola regular solo permite inserciones al final y eliminaciones al principio, permite inserciones o eliminaciones tanto al principio como al final. Una es como una que se puede usar hacia adelante o hacia atrás, o ambas a la vez. Además, se puede generar un iterador hacia adelante y otro hacia atrás. La interfaz es implementada por y . [ 26 ]DequeQueueDequeQueueDequeDequeQueueDequejava.util.ArrayDequejava.util.LinkedList

Implementaciones de Deque

Clase Lista Enlazada

LinkedListPor supuesto, también implementa la Listinterfaz y puede usarse como tal. Pero también tiene los Queuemétodos. LinkedListImplementa la java.util.Dequeinterfaz, lo que le da más flexibilidad. [ 27 ]

Clase ArrayDeque

ArrayDequeimplementa Queuecomo un array. Similar a LinkedList, ArrayDequetambién implementa la java.util.Dequeinterfaz. [ 27 ]

Interfaz BlockingDeque

La java.util.concurrent.BlockingDequeinterfaz extiende java.util.concurrent.BlockingQueue. [ 25 ] es similar a . Proporciona los mismos métodos para inserción y eliminación con límites de tiempo para esperar a que la inserción o eliminación sea posible. Sin embargo, la interfaz también proporciona la flexibilidad de un . Las inserciones y eliminaciones pueden tener lugar en ambos extremos. La función de bloqueo se combina con la función. [ 28 ]BlockingDequeBlockingQueueDequeDeque

Configurar interfaces

La interfaz de Java java.util.Setdefine el Set. Un Setno puede tener elementos duplicados. Además, Setno tiene un orden fijo. Por lo tanto, los elementos no se pueden encontrar por índice. Setes implementado por java.util.HashSet, java.util.LinkedHashSet, y java.util.TreeSet.

Implementaciones de interfaz de configuración

Hay varias implementaciones de la interfaz Set, incluyendo y sus subclases, y la clase interna estática final (donde y son parámetros de tipo formales).AbstractSetConcurrentHashMap.KeySetView<K,V>KV

Conjunto abstracto

AbstractSetes una implementación esquelética para la interfaz. [ 14 ]Set

Las subclases directas de incluyen , , , y .AbstractSetConcurrentSkipListSetCopyOnWriteArraySetEnumSetHashSetTreeSet

Clase EnumSet

La clase extiende . La clase no tiene constructores públicos y solo contiene métodos de fábrica estáticos. [ 29 ]EnumSetAbstractSetEnumSet

EnumSetcontiene el método de fábrica estático . [ 30 ] Este método es un método de agregación. [ 29 ] Toma varios parámetros, toma en cuenta el tipo de los parámetros y luego devuelve una instancia con el tipo apropiado. [ 29 ] A partir de 2018, en Java SE8 la implementación de OpenJDK utiliza dos implementaciones de las cuales son invisibles para el cliente, que son y . [ 29 ] Si ya no proporcionara ningún beneficio de rendimiento para tipos enum pequeños, podría eliminarse de la biblioteca sin afectar negativamente a la Biblioteca de colecciones de Java. [ 29 ]EnumSet.of()EnumSetRegularEnumSetJumboEnumSetRegularEnumSet

EnumSetes un buen reemplazo para los campos de bits , que es un tipo de conjunto, como se describe a continuación. [ 30 ]

Tradicionalmente, cuando los desarrolladores encontraban elementos de un tipo enumerado que debían colocarse en un conjunto, utilizaban el patrón de enumeración `int`, en el que a cada constante se le asignaba una potencia de 2 diferente. [ 30 ] Esta representación de bits permite al desarrollador utilizar la operación OR a nivel de bits, de modo que las constantes se pueden combinar en un conjunto, también conocido como campo de bits . Esta representación de campo de bits permite al desarrollador realizar operaciones eficientes basadas en conjuntos y aritmética a nivel de bits, como la intersección y la unión. [ 30 ]

Sin embargo, existen muchos problemas con el enfoque de representación de campos de bits . Un campo de bits es menos legible que una constante de enumeración entera. [ 30 ] Además, si los elementos se representan mediante campos de bits, es imposible iterar a través de todos estos elementos. [ 30 ]

Un enfoque alternativo recomendado es usar un , donde se usa un enum int en lugar de un campo de bits . [ 30 ] Este enfoque usa un para representar el conjunto de valores que pertenecen al mismo tipo. [ 30 ] Dado que implementa la interfaz y ya no requiere el uso de operaciones bit a bit, este enfoque es más seguro en cuanto a tipos. [ 30 ] Además, hay muchas fábricas estáticas que permiten la instanciación de objetos, como el método . [ 30 ]EnumSetEnumSetEnumEnumSetSetEnumSet.of()

Tras la introducción de la , el enfoque de representación de campos de bits se considera obsoleto. [ 30 ]EnumSet

Clase HashSet

HashSetUtiliza una tabla hash. Más específicamente, la utiliza java.util.LinkedHashMappara almacenar los hashes y los elementos y para evitar duplicados.

Clase LinkedHashSet

La java.util.LinkedHashSetclase se extiende creando una lista doblemente enlazada que vincula todos los elementos según su orden de inserción. Esto garantiza que el orden de iteración sea predecible.HashSetSet

Clase CopyOnWriteArraySet

CopyOnWriteArraySetes un reemplazo concurrente para un sincronizado . Proporciona una concurrencia mejorada en muchas situaciones al eliminar la necesidad de realizar la sincronización o hacer una copia del objeto durante la iteración, de manera similar a como actúa como el reemplazo concurrente para un sincronizado . [ 31 ] Por otro lado, al igual que , no debe usarse cuando la sincronización es obligatoria.SetCopyOnWriteArrayListListCopyOnWriteArrayListCopyOnWriteArraySet

Interfaz SortedSet

La java.util.SortedSetinterfaz extiende la java.util.Setinterfaz. A diferencia de una regular Set, los elementos en una SortedSetestán ordenados, ya sea por el compareTo(T o)método del elemento o por un método proporcionado al constructor de la SortedSet. El primer y último elemento de la SortedSetse pueden recuperar usando los métodos first()y last()respectivamente, y se pueden crear subconjuntos mediante valores mínimos y máximos, así como comenzando o terminando al principio o al final de la SortedSet. La java.util.TreeSetclase implementa la SortedSetinterfaz. [ 32 ]

La java.util.NavigableSetinterfaz extiende la java.util.SortedSetinterfaz y tiene algunos métodos adicionales. Los métodos floor(E e), ceiling(E e), lower(E e), y higher(E e)encuentran un elemento en el conjunto que está cerca del parámetro. Además, Setse proporciona un iterador descendente sobre los elementos en . Al igual que con SortedSet, java.util.TreeSetimplementa NavigableSet. [ 33 ]

Clase TreeSet

java.util.TreeSetutiliza un árbol rojo-negro implementado por un java.util.TreeMap. El árbol rojo-negro garantiza que no haya duplicados. Además, permite TreeSetimplementar java.util.SortedSet. [ 34 ]

Clase ConcurrentSkipListSet

ConcurrentSkipListSetactúa como un reemplazo concurrente para implementaciones de un sincronizado . Por ejemplo, reemplaza un que ha sido envuelto por el método. [ 35 ]SortedSetTreeSetsynchronizedMap

Interfaces de mapas

java.util.MapEn Java, los mapas se definen mediante la interfaz.

Implementaciones de interfaz de mapas

MapLos mapas son estructuras de datos 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 Mapes esencialmente un Setmapa. Si es solo un número creciente, se convierte en una lista.

Ejemplos de implementaciones incluyen , , y .Mapjava.util.HashMapjava.util.LinkedHashMapjava.util.TreeMap

Clase AbstractMap

AbstractMapes un ejemplo de una implementación esquelética . [ 14 ]

Las subclases directas de la clase incluyen , , , , y .AbstractMapConcurrentSkipListMapEnumMapHashMapIdentityHashMapTreeMapWeakHashMap

Mapa de enumeración

EnumMapextiende . tiene una velocidad comparable a la de un array indexado ordinalmente. [ 36 ] Esto se debe a que internamente utiliza un array, con detalles de implementación completamente ocultos para el desarrollador. [ 36 ] Por lo tanto, EnumMap obtiene la seguridad de tipos de un mientras que las ventajas de rendimiento de un array. [ 36 ]AbstractMapEnumMapEnumMapMap

Mapa hash

HashMapUtiliza una tabla hash . Los hashes de las claves se utilizan para encontrar los elementos en varios cubos. Es una colección basada en hash. [ 37 ]HashMap

Mapa hash vinculado

LinkedHashMapSe extiende creando una lista doblemente enlazada entre los elementos, lo que permite acceder a ellos en el orden en que se insertaron en el mapa. Contiene un método que es llamado por el método cada vez que se agrega una nueva clave a la lista . [ 38 ] Elimina su entrada más antigua cuando devuelve verdadero. [ 38 ] El método puede ser sobrescrito. [ 38 ]HashMapLinkedHashMapprotectedremoveEldestEntryputMapMapremoveEldestEntryremoveEldestEntry

Mapa de árbol

TreeMap, a diferencia de y , utiliza un árbol rojo-negro. Las claves se utilizan como valores para los nodos en el árbol, y los nodos apuntan a los elementos en el . [ 39 ]HashMapLinkedHashMapMap

Mapa hash concurrente

ConcurrentHashMapes similar a y también es una colección basada en hash. [ 37 ] Sin embargo, existen varias diferencias, como las diferencias en la estrategia de bloqueo que utilizan.HashMap

Utiliza una estrategia de bloqueo completamente diferente para proporcionar una escalabilidad y concurrencia mejoradas. [ 37 ] No sincroniza todos los métodos usando el mismo bloqueo. [ 37 ] En su lugar, utiliza un mecanismo conocido como distribución de bloqueo . [ 37 ] Este mecanismo proporciona un mecanismo de bloqueo más granular. [ 37 ] También permite un mayor grado de acceso compartido. [ 37 ]ConcurrentHashMapConcurrentHashMapConcurrentHashMap

Clase ConcurrentSkipListMap

ConcurrentSkipListMapactúa como un reemplazo concurrente para implementaciones de un sincronizado . es muy similar a , ya que reemplaza un que ha sido envuelto por el método. [ 35 ]SortedMapConcurrentSkipListMapConcurrentSkipListSetConcurrentSkipListMapTreeMapsynchronizedMap

Subinterfaces de mapa

Interfaz SortedMap

La java.util.SortedMapinterfaz extiende la java.util.Mapinterfaz. Esta interfaz define un Mapque se ordena por las claves proporcionadas. Usando, una vez más, el compareTo()método o un método proporcionado en el constructor de SortedMap, los pares clave-elemento se ordenan por las claves. Las primeras y últimas claves en Mapse pueden llamar usando los métodos firstKey()y lastKey()respectivamente. Además, se pueden crear submapas a partir de las claves mínima y máxima usando el K) subMap(K fromKey, K toKey)método. SortedMapes implementado por java.util.TreeMap. [ 40 ]

La java.util.NavigableMapinterfaz se extiende java.util.SortedMapde diversas maneras. Se pueden llamar métodos que encuentran la clave o entrada del 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. [ 41 ]

Interfaz ConcurrentMap

La java.util.concurrent.ConcurrentMapinterfaz extiende la java.util.Mapinterfaz. Esta interfaz es una interfaz segura para subprocesos, introducida a partir de la versión 1.5 del Java Collections Framework del lenguaje de programación Java . [ 20 ]Map

Extensiones al marco de colecciones de Java

El marco de colecciones de Java se extiende mediante la biblioteca Apache Commons Collections, que agrega tipos de colecciones como un bag y un mapa bidireccional, así como utilidades para crear uniones e intersecciones. [ 42 ]

Google ha lanzado sus propias bibliotecas de colecciones como parte de las bibliotecas de Guava .

Véase también

Citación

  1. "Lección: Introducción a las colecciones" . Oracle Corporation . Consultado el 22 de diciembre de 2010 .
  2. 1 2 3 Bloch 2018 , págs. 126–129, Capítulo §5 Punto 28: Preferir listas a matrices.
  3. 1 2 Horstmann, Cay (2014). Grandes objetos tempranos de Java .
  4. 1 2 "Java Collections Framework" (PDF) . IBM . Archivado del original (PDF) el 7 de agosto de 2011.
  5. Becker, Dan (1 de noviembre de 1998). "Introducción al Java Collections Framework" . JavaWorld . Recuperado el 13 de julio de 2020. Antes de que Collections hiciera su bienvenido debut, los métodos estándar para agrupar objetos Java eran a través de array, Vector y Hashtable. Estas tres colecciones tienen diferentes métodos y sintaxis para acceder a los miembros: los arrays usan los símbolos de corchetes ([]), Vector usa el método elementAt y Hashtable usa los métodos y .getput
  6. 1 2 Lea, Doug . "Descripción general del paquete de colecciones" . Consultado el 1 de enero de 2011. El kit de desarrollo de Java de Sun (JDK 1.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 JDK 1.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.
  7. "Biblioteca de colecciones genérica para Java™" . Archivado del original el 12 de marzo de 2009. Consultado el 1 de enero de 2011 .
  8. Vanhelsuwé, Laurence (1 de junio de 1997). "¿Necesitas un buen conjunto de estructuras de datos abstractas? ¡JGL de ObjectSpace es una maravilla!" . JavaWorld . Recuperado el 13 de julio de 2020. Al igual que Java, la Biblioteca Genérica de Java toma prestado mucho de C++: toma lo mejor de la STL de C++ y deja atrás sus defectos. La mayoría de los programadores de C++ hoy en día conocen su STL, pero pocos logran explotar todo su potencial.
  9. Vanhelsuwé, Laurence (1 de enero de 1999). "La batalla de los frameworks de contenedores: ¿cuál deberías usar?" . JavaWorld . Recuperado el 13 de julio de 2020. Comparar JGL de ObjectSpace Inc. y Collections Framework de Sun resulta ser como comparar peras con manzanas. A primera vista, ambos frameworks parecen competir por los mismos desarrolladores, pero tras una inspección más detallada queda claro que no se pueden comparar de forma justa sin reconocer primero que tienen objetivos diferentes. Si, como afirma la documentación de Sun, Collections va a homogeneizar las API de Sun (API principal, extensiones, etc.), entonces sin duda Collections debe ser una gran noticia, y algo bueno, incluso para el adicto más fanático de JGL. Siempre que Sun cumpla su promesa en este aspecto, estaré encantado de invertir mis recursos en adoptar Collections seriamente.
  10. Lea, Doug . "Descripción general del paquete util.concurrent versión 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 correcciones esenciales. El paquete java.util.concurrent de J2SE5 incluye versiones mejoradas, más eficientes y estandarizadas de los componentes principales de este paquete.
  11. Bloch 2018 , págs. 87–92, Capítulo §8 Punto 8: Favorecer la composición sobre la herencia.
  12. "Iterable (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  13. Bloch 2018 , págs. 117–122, Capítulo §5 Punto 26: No utilice tipos sin procesar.
  14. 1 2 3 Bloch 2018 , págs. 99–103, Capítulo §4 Punto 20: Preferir las interfaces a las clases abstractas.
  15. "Lista (Plataforma Java SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  16. 1 2 Bloch 2018 , págs. 87–92, Capítulo §4 Punto 18: Favorecer la composición sobre la herencia.
  17. 1 2 3 Bloch 2018 , págs. 317–322, Capítulo §11 Punto 79: Evitar la sincronización excesiva.
  18. 1 2 Bloch 2018 , págs. 280–281, Capítulo §9 Punto 64: Referenciar objetos por sus interfaces.
  19. "PriorityQueue (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  20. 1 2 3 Goetz et al. 2006 , pp. 84–85, §5.2 Colecciones concurrentes.
  21. 1 2 3 Goetz et al. 2006 , pp. 52–53, §3.5.3 Modismos de publicación segura.
  22. Bloch 2018 , págs. 325–329, Capítulo §11 Elemento 78: Sincronizar el acceso a datos mutables compartidos.
  23. "BlockingQueue (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  24. Bloch 2018 , págs. 325–329, Capítulo §11 Punto 81: Preferir las utilidades de concurrencia a esperar y notificar.
  25. 1 2 Goetz et al. 2006 , p. 92, §5.3.3 Deques y robo de trabajo.
  26. "Deque (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  27. 1 2 "Cola (Plataforma Java SE 7)" . Docs.oracle.com. 2013-06-06 . Recuperado el 2013-08-16 .
  28. "BlockingDeque (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  29. 1 2 3 4 5 Bloch 2018 , págs. 5–9, Capítulo §5 Utilice EnumSet en lugar de campos de bits.
  30. 1 2 3 4 5 6 7 8 9 10 11 Bloch 2018 , págs. 169–170, Capítulo §5 Utilice EnumSet en lugar de campos de bits.
  31. ^ Goetz y col. 2006 , págs. 86–89, §5.2.3 CopyOnWriteArrayList.
  32. "SortedSet (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  33. «NavigableSet (Plataforma Java SE 7)» . Docs.oracle.com. 2013-06-06.
  34. "Set (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  35. 1 2 Goetz et al. 2006 , pp. 84–85, §5.2 Colecciones Concurrentes.
  36. 1 2 3 Bloch 2018 , págs. 171–175, Capítulo §6 Elemento 36: Usar EnumMap en lugar de indexación ordinal.
  37. 1 2 3 4 5 6 7 Goetz et al. 2006 , pp. 85–86, §5.2.1 ConcurrentHashMap.
  38. 1 2 3 Bloch 2018 , págs. 199–202, Capítulo §44 Favorecer el uso de interfaces funcionales estándar.
  39. "Mapa (Plataforma Java SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  40. "SortedMap (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . Consultado el 2013-08-16 .
  41. "NavigableMap (Java Platform SE 7)" . Docs.oracle.com. 6 de junio de 2013. Consultado el 16 de agosto de 2013 .
  42. "Colecciones - Inicio" . Commons.apache.org. 4 de julio de 2013. Consultado el 16 de agosto de 2013 .

Referencias

  • Bloch, Joshua (2018). «Java eficaz: Guía del lenguaje de programación» (tercera  ed.). Addison-Wesley. ISBN 978-0134685991.
  • Goetz, Brian; Peierls, Tim; Bloch, Joshua; Bowbeer, Joseph; Holmes, David; Lea, Doug (2006). Java Concurrency in Practice . Addison Wesley. ISBN 0-321-34960-1. OL 25208908M .