En esta pregunta, ¿cómo puedo seleccionar eficientemente un contenedor de biblioteca estándar en C ++ 11? es un diagrama de flujo útil para usar al elegir colecciones de C ++.
Pensé que este era un recurso útil para las personas que no están seguras de qué colección deberían usar, así que intenté encontrar un diagrama de flujo similar para Java y no pude hacerlo.
¿Qué recursos y "hojas de trucos" están disponibles para ayudar a las personas a elegir la Colección correcta para usar al programar en Java? ¿Cómo saben las personas qué implementaciones de listas, conjuntos y mapas deben usar?
Respuestas:
Como no pude encontrar un diagrama de flujo similar, decidí hacer uno yo mismo.
Este diagrama de flujo no intenta abarcar cosas como el acceso sincronizado, la seguridad de subprocesos, etc. o las colecciones heredadas, pero cubre los 3 conjuntos estándar , los 3 mapas estándar y las 2 listas estándar .
Esta imagen fue creada para esta respuesta y está licenciada bajo una licencia internacional Creative Commons Attribution 4.0. La atribución más simple es vincularse a esta pregunta o a esta respuesta.
Otros recursos
Probablemente la otra referencia más útil es la siguiente página de la documentación de Oracle que describe cada Colección .
HashSet vs TreeSet
Hay una discusión detallada de cuándo usar
HashSet
oTreeSet
aquí: Hashset vs TreesetArrayList vs LinkedList
Discusión detallada: ¿ Cuándo usar LinkedList sobre ArrayList?
fuente
LinkedList
vs.ArrayList
Primero, si la lista es de un tamaño significativo,LinkedList
es preferible.LinkedList
tiene una sobrecarga por elemento, por lo que es asintóticamente peor en términos de consumo de memoria que unArrayList
. Además, si la mayor parte del acceso se encuentra al final de la lista,ArrayList
es preferible un porque proporciona acceso aleatorio a elementos de tiempo constante. Acceder aln
elemento th de aLinkedList
es unaO(n)
operación. ... De hecho, la decisión de usar una lista vinculada siempre debería ser "no".LinkedList
es una lista de doble enlace, por lo que el acceso al inicio y al final son rápidos. Notarás que de las ramas de arriba, las tres preguntas tienen que responder sí antes de recomendar el uso deLinkedList
- así que, en otras palabras, estoy de acuerdo contigo en que en la mayoría de los casos la respuesta es no. Cosas como colas y colas en las que constantemente está agregando y eliminando cosas de los extremos del área de lista para un buen caso de usoLinkedList
.LinkedList
usa más memoria por elemento ...ArrayList
nunca libera memoria. Eso significa que si tiene una lista que a veces crece a un tamaño enorme, pero generalmente es pequeña, entonces elArrayList
rendimiento de la memoria será peor. La sobrecarga de memoria deList
sí mismo es generalmente (aunque no siempre) pequeña en comparación con la de los elementos que contiene también.Map<K,V>
no es parte dejava.util.collection
Resumen de las principales colecciones no concurrentes, no sincronizadas
Collection
: Una interfaz que representa una "bolsa" desordenada de elementos, llamada "elementos". El elemento "siguiente" no está definido (al azar).Set
: Una interfaz que representaCollection
a sin duplicados.HashSet
: ASet
respaldado por aHashtable
. El uso de memoria más rápido y más pequeño, cuando ordenar no es importante.LinkedHashSet
: AHashSet
con la adición de una lista vinculada para asociar elementos en orden de inserción . El elemento "siguiente" es el siguiente elemento insertado más recientemente.TreeSet
: ASet
donde los elementos están ordenados por aComparator
(típicamente ordenamiento natural ). Uso de memoria más lento y más grande, pero necesario para pedidos basados en comparadores.EnumSet
: Un extremadamente rápido y eficienteSet
personalizado para un solo tipo de enumeración.List
: Una interfaz que representa unCollection
cuyos elementos están ordenados y cada uno tiene un índice numérico que representa su posición, donde cero es el primer elemento y(length - 1)
es el último.ArrayList
:List
Respaldado por una matriz, donde la matriz tiene una longitud (llamada "capacidad") que es al menos tan grande como la cantidad de elementos (el "tamaño" de la lista). Cuando el tamaño excede la capacidad (cuando(capacity + 1)-th
se agrega el elemento), la matriz se recrea con una nueva capacidad de(new length * 1.5)
--esta recreación es rápida, ya que utilizaSystem.arrayCopy()
. Eliminar e insertar / agregar elementos requiere que todos los elementos vecinos (a la derecha) se desplacen dentro o fuera de ese espacio. Acceder a cualquier elemento es rápido, ya que solo requiere el cálculo(element-zero-address + desired-index * element-size)
para encontrar su ubicación. En la mayoría de las situaciones ,ArrayList
se prefiere a sobreLinkedList
.LinkedList
: AList
respaldado por un conjunto de objetos, cada uno vinculado a sus vecinos "anteriores" y "siguientes". ALinkedList
también es aQueue
yDeque
. El acceso a los elementos se realiza comenzando por el primer o el último elemento, y atravesando hasta alcanzar el índice deseado. La inserción y eliminación, una vez que se alcanza el índice deseado a través del recorrido, es una cuestión trivial de reasignar solo los enlaces vecinos inmediatos para apuntar al nuevo elemento o evitar el elemento ahora eliminado.Map
: Una interfaz que representa unCollection
donde cada elemento tiene una "clave" de identificación: cada elemento es un par clave-valor.HashMap
: UNAMap
donde las claves están desordenadas y respaldadas por aHashtable
.LinkedhashMap
: Las claves están ordenadas por orden de inserción .TreeMap
: AMap
donde las claves se ordenan por aComparator
(orden típicamente natural).Queue
: Una interfaz que representa unCollection
elementos donde normalmente se agregan a un extremo y se eliminan del otro (FIFO: primero en entrar, primero en salir).Stack
: Una interfaz que representa unCollection
donde los elementos son, típicamente, tanto agregados (empujados) como eliminados (reventados) del mismo extremo (LIFO: último en entrar, primero en salir).Deque
: Abreviatura de "cola doble", generalmente se pronuncia "cubierta". Una lista vinculada que generalmente solo se agrega y se lee desde cualquier extremo (no desde el medio).Diagramas básicos de recolección:
Comparando la inserción de un elemento con an
ArrayList
yLinkedList
:fuente
Una imagen aún más simple está aquí. ¡Intencionalmente simplificado!
Colección es cualquier cosa que contenga datos llamados "elementos" (del mismo tipo). No se asume nada más específico.
La lista es unacolección indexada de datos donde cada elemento tiene un índice. Algo así como la matriz, pero más flexible.
Los datos en la lista mantienen el orden de inserción.
Operación típica: obtener el enésimo elemento.
Set es una bolsa de elementos , cada elemento solo una vez (los elementos se distinguen usando su
equals()
método.Los datos en el conjunto se almacenan principalmente para saber qué datos hay.
Operación típica: saber si un elemento está presente en la lista.
El mapa es algo así como la Lista, pero en lugar de acceder a los elementos por su índice entero, puede acceder a ellos por su clave , que es cualquier objeto. Al igual que la matriz en PHP :)
Los datos en el mapa se pueden buscar por su clave.
Operación típica: obtener un elemento por su ID (donde la ID es de cualquier tipo, no solo
int
como en el caso de List).Las diferencias
Establecer y Mapa: en Establecer, puede buscar datos por sí mismos , mientras que en el Mapa por su clave .
Lista y mapa: en la lista puede acceder al elemento por su
int
índice (posición en la lista), mientras que en el mapa por su clave, que es de cualquier tipo (normalmente: ID)List and Set: en List, los elementos están vinculados por su posición y pueden duplicarse, mientras que en Set los elementos son simplemente "presentes" (pr no presentes) y son únicos (en el sentido de
equals()
, ocompareTo()
paraSortedSet
)fuente
Es simple: si necesita almacenar valores con las teclas asignadas a ellos, vaya a la interfaz de Mapa, de lo contrario use Lista para valores que pueden estar duplicados y finalmente use la interfaz Establecer si no desea valores duplicados en su colección.
Aquí está la explicación completa http://javatutorial.net/choose-the-right-java-collection , incluido el diagrama de flujo, etc.
fuente
Mapa
Si elijo una
Map
, hice esta tabla que resume las características de cada una de las diez implementaciones incluidas con Java 11.fuente
Colecciones comunes, colecciones comunes
fuente
¿Qué colección Java debo usar?
Depende de qué problema está tratando de resolver o qué requisitos tiene.
Ejemplos:
fuente