Saltar a contenido

📦 Colecciones en Java – Introducción

En temas anteriores hemos trabajado con arrays y con programación orientada a objetos.
Ahora vamos a estudiar una de las partes más importantes de Java: las colecciones.

Las colecciones nos permiten almacenar y gestionar grupos de objetos de forma flexible y eficiente.


1️⃣ Limitaciones de los arrays

Los arrays han sido nuestra primera estructura para almacenar varios elementos.

Ejemplo:

String[] alumnos = new String[5];

alumnos[0] = "Ana";
alumnos[1] = "Luis";
alumnos[2] = "Carlos";

Los arrays funcionan bien en muchos casos, pero tienen varias limitaciones importantes.


❌ Tamaño fijo

Cuando creamos un array debemos indicar su tamaño.

int[] numeros = new int[5];

Este array siempre tendrá tamaño 5.

Si necesitamos guardar más elementos:

  • no podemos ampliarlo
  • habría que crear otro array más grande
  • copiar todos los datos

Esto hace que trabajar con arrays sea poco flexible cuando el número de elementos cambia.


❌ Insertar o eliminar elementos es incómodo

Si queremos insertar un elemento en medio de un array debemos desplazar todos los elementos posteriores.

Array original:

[Ana, Luis, Carlos]

Insertar "Marta" en posición 1:

[Ana, Marta, Luis, Carlos]

Para hacerlo con arrays hay que mover manualmente los valores.


❌ No tienen métodos útiles

Los arrays tienen muy pocas operaciones incorporadas.

Por ejemplo:

  • no tienen método para buscar un elemento
  • no tienen método para ordenar
  • no tienen método para eliminar elementos
  • no tienen método para comprobar si un elemento existe

Todo esto debemos programarlo a mano.


❌ Gestión manual de operaciones comunes

Operaciones muy habituales requieren código extra:

  • buscar un elemento
  • contar elementos
  • ordenar
  • eliminar duplicados
  • filtrar elementos

Esto provoca que el código sea:

  • más largo
  • más complejo
  • más propenso a errores

💡 Ejemplo real

Imagina que queremos guardar una lista de videojuegos.

Con arrays:

String[] juegos = new String[100];

Problemas:

  • ¿y si solo usamos 10?
  • ¿y si necesitamos 120?
  • ¿cómo eliminamos uno?
  • ¿cómo sabemos cuántos hay realmente?

Los arrays no están pensados para estructuras dinámicas.


🤔 Si los arrays tienen tantas limitaciones… ¿por qué los hemos aprendido?

Aunque los arrays tienen limitaciones, siguen siendo una estructura fundamental en programación. De hecho, muchas estructuras más avanzadas (como las colecciones) se construyen internamente a partir de arrays.

Por eso es importante entenderlos porque:

  • Porque son la base de muchas estructuras de datos.
  • Son muy eficientes, los arrays son muy rápidos.
  • Son universales, existen en casi todos los lenguajes de programación: c++, c, python, javascript, etc.

2️⃣ Qué son las colecciones

Las colecciones son estructuras que permiten almacenar y gestionar grupos de objetos de forma dinámica y flexible.

A diferencia de los arrays, las colecciones:

  • pueden crecer o reducirse automáticamente
  • tienen muchos métodos útiles
  • permiten buscar, ordenar, eliminar o recorrer elementos fácilmente

Ejemplo:

import java.util.ArrayList;

ArrayList<String> alumnos = new ArrayList<>();

alumnos.add("Ana");
alumnos.add("Luis");
alumnos.add("Carlos");

La colección gestiona automáticamente el tamaño y las operaciones.

Ventajas:

  • ✔ el tamaño crece automáticamente
  • ✔ podemos añadir y eliminar elementos fácilmente
  • ✔ existen métodos para buscar, ordenar o recorrer

🎯 Idea clave

Una colección es un objeto que almacena otros objetos.

Por ejemplo:

  • una lista de alumnos
  • un conjunto de nombres únicos
  • un mapa de DNI → persona
  • una cola de pacientes

🧠 Concepto importante: genéricos

Las colecciones utilizan genéricos. Que veremos más adelante qué son exactamente. De momento lo que nos ayuda es a crear colecciones con distinto tipo de datos.

Ejemplo:

ArrayList<String>
ArrayList<Integer>
ArrayList<Producto>

Esto indica qué tipo de objetos puede guardar la colección.

Ejemplo:

ArrayList<Integer> numeros = new ArrayList<>();

Solo podremos guardar enteros.


⚠️ Tipos primitivos y colecciones

Las colecciones NO pueden usar tipos primitivos directamente.

❌ Incorrecto:

ArrayList<int> numeros = new ArrayList<>();

✔ Correcto:

ArrayList<Integer> numeros = new ArrayList<>();

Java utiliza clases envoltorio (Wrapper Classes).

Tipo primitivo Clase
int Integer
double Double
boolean Boolean
char Character

3️⃣ Jerarquía general de colecciones

Las colecciones forman parte del Java Collections Framework, que es un conjunto de interfaces y clases diseñadas para trabajar con estructuras de datos.

La jerarquía principal es la siguiente:

Collection
├── List
├── Set
└── Queue

Además existe otra estructura muy importante, el Mapa:

Map

Que no hereda de Collection, pero forma parte del mismo framework.

Colecciones


📚 Tipos principales de colecciones

📋 List

Representa listas ordenadas de elementos.

Características:

  • mantiene el orden de inserción
  • permite elementos duplicados
  • permite acceder por posición

Ejemplos de implementación:

ArrayList
LinkedList

Ejemplo:

import java.util.ArrayList;
import java.util.List;

List<String> nombres = new ArrayList<>();

nombres.add("Ana");
nombres.add("Luis");
nombres.add("Ana");

Resultado:

[Ana, Luis, Ana]

🧩 Set

Representa conjuntos de elementos únicos.

Características:

  • no permite duplicados
  • no tiene posiciones
  • se usa para evitar repetidos

Implementaciones:

HashSet
TreeSet
LinkedHashSet

Ejemplo:

import java.util.HashSet;
import java.util.Set;

Set<String> nombres = new HashSet<>();

nombres.add("Ana");
nombres.add("Luis");
nombres.add("Ana");

Resultado:

[Ana, Luis]

El segundo "Ana" no se guarda.


🔑 Map

Un Map guarda pares clave → valor.

Ejemplo:

DNI → Persona
usuario → contraseña
producto → precio

Implementaciones:

HashMap
TreeMap
LinkedHashMap

Ejemplo:

import java.util.HashMap;
import java.util.Map;

Map<String, Integer> notas = new HashMap<>();

notas.put("Ana", 9);
notas.put("Luis", 7);

Resultado:

Ana → 9
Luis → 7

📊 Comparación rápida

Estructura Permite duplicados Mantiene orden Acceso por índice
List
Set depende
Map clave única depende

🧠 Resumen

Los arrays:

  • tienen tamaño fijo
  • requieren mucho código para operaciones comunes
  • no son flexibles

Las colecciones:

  • ✔ tamaño dinámico
  • ✔ muchas operaciones útiles
  • ✔ mejor organización del código
  • ✔ estructuras especializadas según el problema

Principales tipos de colecciones:

  • List → listas ordenadas
  • Set → conjuntos sin duplicados
  • Map → pares clave-valor

En las siguientes secciones estudiaremos cada una de estas estructuras en detalle.