¿Qué colección de Java debería usar?

En esta pregunta, ¿cómo puedo seleccionar de manera eficiente un contenedor de Biblioteca estándar en C ++ 11? es un diagtwig de flujo práctico para usar al elegir colecciones de C ++.

Pensé que era un recurso útil para las personas que no están seguras de qué colección deberían utilizar, así que traté de encontrar un diagtwig 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 progtwigr en Java? ¿Cómo sabe la gente qué implementaciones de listas, conjuntos y mapas deben usar?

Como no pude encontrar un diagtwig de flujo similar, decidí hacer uno yo mismo.

Este diagtwig de flujo no trata de cubrir aspectos como el acceso sincronizado, la seguridad del hilo, etc. o las colecciones heredadas, pero cubre los 3 conjuntos estándar, 3 mapas estándar y 2 listas estándar.

enter image description here

Esta imagen fue creada para esta respuesta y está autorizada bajo una licencia internacional Creative Commons Attribution 4.0. La atribución más simple es vincular a esta pregunta o a esta respuesta.

Otros recursos

Probablemente la otra referencia más útil sea la siguiente página de la documentación del oracle que describe cada Colección .

HashSet vs TreeSet

Hay una discusión detallada sobre cuándo usar HashSet o TreeSet aquí: Hashset vs Treeset

ArrayList vs LinkedList

Discusión detallada: ¿ Cuándo usar LinkedList sobre ArrayList?

Resumen de las principales colecciones no simultáneas y no sincronizadas

Collection : una interfaz que representa una “bolsa” de artículos sin ordenar, llamada “elementos”. El elemento “siguiente” no está definido (al azar).

  • Set : una interfaz que representa una Collection sin duplicados.
    • HashSet : Un Set respaldado por una Hashtable . El uso de memoria más rápido y más pequeño, cuando el pedido no es importante.
    • LinkedHashSet : Un HashSet con la adición de una lista vinculada para asociar elementos en el orden de inserción . El elemento “siguiente” es el siguiente elemento insertado más recientemente.
    • TreeSet : Un Set donde los elementos son ordenados por un Comparator (típicamente ordenamiento natural ). Uso de memoria más lento y más grande, pero necesario para pedidos basados ​​en comparadores.
    • EnumSet : Un conjunto extremadamente rápido y eficiente personalizado para un solo tipo de enumeración.
  • List : una interfaz que representa una Collection 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 : una List respaldada 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 se agrega el elemento (capacity + 1)-th ), la matriz se recrea con una nueva capacidad de (new length * 1.5) Esta recreación es rápida, ya que usa System.arrayCopy() . Eliminar e insertar / agregar elementos requiere que todos los elementos vecinos (a la derecha) se desplacen dentro o fuera de ese espacio. El acceso 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 , se prefiere una ArrayList sobre LinkedList .
    • LinkedList : una List respaldada por un conjunto de objetos, cada uno vinculado a sus vecinos “anterior” y “siguiente”. Una LinkedList también es una Queue y Deque . El acceso a los elementos se realiza comenzando por el primer o el último elemento y atravesando hasta que se alcanza el índice deseado. La inserción y eliminación, una vez que se alcanza el índice deseado mediante el recorrido, es una cuestión trivial de reasignar solo los enlaces de vecinos inmediatos para apuntar al elemento nuevo o eludir el elemento ahora borrado.
  • Map : una interfaz que representa una Collection donde cada elemento tiene una “clave” de identificación: cada elemento es un par clave-valor.
    • HashMap : un Map donde las claves están desordenadas y respaldadas por una Hashtable .
    • LinkedhashMap : las claves se ordenan por orden de inserción .
    • TreeMap : un Map donde las claves son ordenadas por un Comparator (normalmente ordenamiento natural).
  • Queue : una interfaz que representa una Collection donde los elementos se agregan, por lo general, a un extremo y se eliminan del otro (FIFO: primero en entrar, primero en salir).
  • Stack : una interfaz que representa una Collection donde los elementos son, típicamente, agregados (empujados) y eliminados (reventados) desde el mismo extremo (LIFO: último en entrar, primero en salir).
  • Deque : Deque de “cola de doble final”, generalmente pronunciada “cubierta”. Una lista vinculada que normalmente solo se agrega y lee desde cualquiera de los extremos (no desde el medio).

Diagtwigs de colección básicos:

diagrama

Comparando la inserción de un elemento con ArrayList y LinkedList :

diagrama

Incluso una imagen más simple está aquí. ¡Intencionalmente simplificado!

  1. La colección es cualquier cosa que contenga datos llamados “elementos” (del mismo tipo). No se supone nada más específico.

  2. List es una colecció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.

  3. Set es una bolsa de elementos , cada elemento solo una vez (los elementos se distinguen usando su método equals() .

    Los datos en el conjunto se almacenan principalmente solo para saber qué datos hay.

  4. El mapa es algo así como la Lista, pero en lugar de acceder a los elementos por su índice entero, accede a ellos por su clave , que es cualquier objeto. Me gusta la matriz en PHP 🙂

    Los datos en el mapa se pueden buscar por su clave.

    La principal diferencia entre el Conjunto y el Mapa es que en Establecer los datos de búsqueda por sí mismos , mientras que en el mapa por su clave .

Es simple: si necesita almacenar valores con claves asignadas vaya a la interfaz de Mapa, de lo contrario use Lista para valores que pueden duplicarse 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 diagtwig de flujo, etc.