Colecciones en Java
Las colecciones en Java son un conjunto de clases e interfaces que permiten almacenar, organizar y manipular datos de forma eficiente. El marco de colecciones de Java (Java Collections Framework, JCF) es una parte fundamental de la biblioteca estándar del lenguaje.
¿Qué es el Framework de Colecciones?
El JCF proporciona una arquitectura unificada para manejar grupos de objetos. Incluye interfaces, clases e implementaciones para trabajar con listas, conjuntos, colas, mapas y más.
Componentes Principales:
- Interfaces: Definen el comportamiento de las colecciones (e.g.,
List,Set,Map). - Clases: Implementaciones concretas de las interfaces (e.g.,
ArrayList,HashSet,HashMap). - Algoritmos: Métodos para manipular colecciones (e.g., ordenación, búsqueda).
Tipos de Colecciones
1. Listas (List)
Permiten almacenar elementos en un orden específico y pueden contener duplicados.
Implementaciones comunes:
ArrayList: Lista basada en un array dinámico.LinkedList: Lista doblemente enlazada.
Ejemplo:
import java.util.ArrayList;
public class EjemploArrayList {
public static void main(String[] args) {
ArrayList<String> lista = new ArrayList<>();
lista.add("Manzana");
lista.add("Banana");
lista.add("Cereza");
System.out.println("Lista: " + lista);
lista.remove("Banana");
System.out.println("Después de eliminar: " + lista);
}
}2. Conjuntos (Set)
No permiten elementos duplicados.
Implementaciones comunes:
HashSet: Basado en un mapa hash.TreeSet: Ordena los elementos automáticamente.
Ejemplo:
import java.util.HashSet;
public class EjemploHashSet {
public static void main(String[] args) {
HashSet<Integer> numeros = new HashSet<>();
numeros.add(10);
numeros.add(20);
numeros.add(10); // Duplicado, no se agrega
System.out.println("Conjunto: " + numeros);
}
}3. Mapas (Map)
Almacenan pares clave-valor. No permiten claves duplicadas, pero sí valores duplicados.
Implementaciones comunes:
HashMap: Basado en un mapa hash.TreeMap: Ordenado por las claves.
Ejemplo:
import java.util.HashMap;
public class EjemploHashMap {
public static void main(String[] args) {
HashMap<String, Integer> edades = new HashMap<>();
edades.put("Juan", 25);
edades.put("Ana", 30);
edades.put("Luis", 20);
System.out.println("Edades: " + edades);
edades.remove("Luis");
System.out.println("Después de eliminar: " + edades);
}
}4. Pilas y Colas (Stack & Queue)
Permiten manejar datos en un orden específico.
Pilas (LIFO - Last In, First Out):
import java.util.Stack;
public class EjemploStack {
public static void main(String[] args) {
Stack<String> pila = new Stack<>();
pila.push("A");
pila.push("B");
pila.push("C");
System.out.println("Pila: " + pila);
System.out.println("Elemento eliminado: " + pila.pop());
System.out.println("Pila después de pop: " + pila);
}
}Colas (FIFO - First In, First Out):
import java.util.LinkedList;
import java.util.Queue;
public class EjemploQueue {
public static void main(String[] args) {
Queue<String> cola = new LinkedList<>();
cola.add("Primero");
cola.add("Segundo");
cola.add("Tercero");
System.out.println("Cola: " + cola);
System.out.println("Elemento eliminado: " + cola.poll());
System.out.println("Cola después de poll: " + cola);
}
}Métodos Útiles en Colecciones
- Iterar con bucle
for-each:
for (String elemento : lista) {
System.out.println(elemento);
}- Ordenar una lista:
import java.util.ArrayList;
import java.util.Collections;
ArrayList<Integer> numeros = new ArrayList<>();
numeros.add(3);
numeros.add(1);
numeros.add(2);
Collections.sort(numeros);
System.out.println("Lista ordenada: " + numeros);- Buscar un elemento:
boolean existe = lista.contains("Manzana");
System.out.println("¿Contiene Manzana?: " + existe);Buenas Prácticas con Colecciones
- Elige la colección adecuada: Usa
ArrayListpara acceso rápido,LinkedListpara inserciones/eliminaciones frecuentes. - Inicializa con un tamaño adecuado: Reduce el costo de redimensionamiento para colecciones grandes.
- Evita iterar manualmente si puedes usar métodos de alto nivel: Prefiere
for-eacho streams. - Usa genéricos: Aumenta la seguridad en tiempo de compilación.
Conclusión
Las colecciones en Java proporcionan herramientas poderosas para trabajar con datos de manera eficiente. Dominar sus diferentes tipos y métodos es fundamental para construir aplicaciones robustas y escalables.
