Introducción

Casi todos los programas necesitan almacenar algún conjunto de datos. Pueden ser cadenas de texto y números, objetos, entre otros. Los arreglos son una solución excelente para el almacenamiento. Pero los arreglos tienen ciertas limitaciones. Por ejemplo, su tamaño es fijo, no se pueden eliminar elementos y no se pueden insertar elementos en el medio. Las colecciones fueron creadas para superar estas y otras limitaciones. Todos los tipos de colecciones (y hay muchos, como veremos más adelante en esta lección) tienen la capacidad de cambiar su tamaño dinámicamente. Algunos tipos de colección pueden almacenar elementos ordenados y automáticamente poner los nuevos elementos en orden a medida que se agregan.

En esta lección, nos familiarizaremos con la jerarquía de clases de las colecciones básicas en el Marco de colecciones de Java. También hay varias bibliotecas alternativas que amplían las capacidades del Marco de colecciones de Java estándar. La más popular de estas es Guava (Biblioteca de colecciones de Google).

*No se representan todas las interfaces y clases en el diagrama. Algunas se omitieron para facilitar la comprensión.

Interfaces básicas

El diagrama muestra que hay dos interfaces básicas que se implementan para formar el resto de las clases e interfaces.

Echemos un vistazo a estas interfaces:

  1. Collection — Una colección común que contiene un conjunto de elementos (objetos). Esta colección tiene métodos básicos para trabajar con elementos: insertar (add, addAll), eliminar (remove, removeAll, clear), buscar (contains, containsAll), verificar si la colección está vacía (isEmpty) y obtener el tamaño (size).

  2. Map — Una colección estructurada como pares de clave-valor. Además, cada clave en un Map es única: no hay dos claves con valores idénticos. Esta colección a veces se llama un diccionario. Map es una interfaz separada. No implementa la interfaz Collection, pero es parte del Java Collections Framework.

Métodos útiles para trabajar con elementos en un Map:

  • insertar (put, putAll)

  • obtener (get, keySet, values, entrySet)

  • eliminar (remove, clear)

  • buscar (containsKey, containsValue)

  • verificar si la colección está vacía (isEmpty)

  • obtener el tamaño (size)

Ahora hablemos más acerca de cada uno de ellos.

Interfaz Collection

La interfaz Collection extiende la interfaz Iterable, la cual tiene un solo método: iterator(). Para nosotros, esto significa que cualquier colección que herede de Iterable podrá devolver un iterador.

Un iterador es un objeto especial que puedes usar para acceder a los elementos de cualquier colección, sin importar su implementación específica.

La figura muestra que 3 interfaces heredan de la interfaz Collection: List, Queue y Set. Ahora los veremos brevemente.

Un List es una colección ordenada que permite valores duplicados. Una característica particular de una List es que sus elementos están numerados y pueden ser accedidos por número (índice).

Una Queue almacena elementos en el orden en que fueron agregados a la cola.

A diferencia de una lista, un Set representa una colección desordenada que no permite elementos repetidos. La interfaz Set corresponde al concepto de un conjunto matemático.

Implementaciones de la interfaz Map

Podemos ver que la interfaz Map representa una asignación entre claves únicas y valores.

interface Map<K, V>

Donde K es el tipo de clave y V es el tipo de valor almacenado.

Usando una clave, podemos extraer datos de un Map. Para agregar un elemento a un Map, debemos especificar una clave y un valor.

Veamos algunas implementaciones de Map:

  1. HashMap es una implementación de Map que se basa en tablas hash. Puede almacenar claves y valores de cualquier tipo, incluyendo null. El orden de los elementos no está garantizado.

  2. LinkedHashMap es una estructura de datos que almacena datos como una lista vinculada de elementos. Los elementos aparecen en la lista en el orden en que se agregaron.

  3. TreeMap implementa la interfaz SortedMap (a través de la interfaz NavigableMap). Los elementos en esta estructura se almacenan en orden ordenado (cuando se agrega un nuevo elemento, la colección se ordena automáticamente). TreeMap es excelente para almacenar grandes cantidades de datos ordenados con una rápida recuperación.

Colecciones obsoletas:

Java tiene colecciones obsoletas de versiones anteriores (para mantener la compatibilidad hacia atrás). Estas colecciones antiguas no deben usarse en código nuevo:

  • Enumeration - análogo a la interfaz Iterator;

  • Vector - una lista ordenada de elementos y análogo a la clase ArrayList;

  • Stack — an implementation of the stack data structure, which stores and manipulates elements like how you would interact with a stack of books. There are methods for adding elements to the stack (push) and taking them off (pop);

  • Dictionary — analogous to the Map interface, but it is an abstract class;

  • Hashtable — analogous to HashMap.

Puedes leer más sobre el Marco de colecciones en este artículo.