03.1 ‐ Java Collections - Cyb3rh4ck/java-core-fundamentals GitHub Wiki
¡Por supuesto! Te haré una explicación completa y avanzada de Java Collections en JDK 17+, incluyendo mejoras, mejores prácticas y ejemplos avanzados. 🚀
Las Java Collections son un conjunto de clases e interfaces en el paquete java.util
que permiten almacenar, manipular y procesar datos de manera eficiente.
La API de Collections se basa en Generics y proporciona listas, conjuntos, mapas, colas y más.
-
List<E>
→ Permite duplicados y mantiene el orden. -
Set<E>
→ No permite duplicados. -
Queue<E>
→ FIFO (First-In-First-Out), usada en colas.
Aunque Map<K, V>
no implementa Collection<E>
, es fundamental en la API de colecciones.
📌 Diagrama de las interfaces principales:
Collection<E>
│
├── List<E> → Listas ordenadas con elementos duplicados
│ ├── ArrayList<E>
│ ├── LinkedList<E>
│ ├── Vector<E> (obsoleto en muchos casos)
│
├── Set<E> → No permite duplicados
│ ├── HashSet<E> (sin orden)
│ ├── LinkedHashSet<E> (orden de inserción)
│ ├── TreeSet<E> (orden natural o comparador)
│
├── Queue<E> → FIFO
│ ├── PriorityQueue<E> (orden por prioridad)
│ ├── LinkedList<E> (doble enlace, usada como cola)
│
└── Deque<E> → Doble cola (FIFO o LIFO)
├── ArrayDeque<E> (eficiente y sin sincronización)
Map<K, V> → Almacena pares clave-valor (no hereda de Collection)
├── HashMap<K, V> → Sin orden específico
├── LinkedHashMap<K, V> → Mantiene orden de inserción
└── TreeMap<K, V> → Ordenado por clave
Permiten duplicados, acceso por índice y son dinámicas.
import java.util.*;
public class ListExample {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>(List.of("A", "B", "C"));
List<String> linkedList = new LinkedList<>(arrayList);
arrayList.add("D");
linkedList.add("E");
System.out.println("ArrayList: " + arrayList);
System.out.println("LinkedList: " + linkedList);
}
}
📌 Diferencias clave:
✅ ArrayList
es rápido para acceso por índice (O(1)), pero lento para inserciones/eliminaciones intermedias.
✅ LinkedList
es rápido en inserciones/eliminaciones intermedias (O(1)), pero lento para acceso por índice (O(n)).
No permiten duplicados y pueden o no mantener orden.
import java.util.*;
public class SetExample {
public static void main(String[] args) {
Set<Integer> hashSet = new HashSet<>(Set.of(3, 1, 2, 1)); // Sin orden
Set<Integer> linkedHashSet = new LinkedHashSet<>(Set.of(3, 1, 2, 1)); // Orden de inserción
Set<Integer> treeSet = new TreeSet<>(Set.of(3, 1, 2, 1)); // Ordenado
System.out.println("HashSet: " + hashSet);
System.out.println("LinkedHashSet: " + linkedHashSet);
System.out.println("TreeSet: " + treeSet);
}
}
📌 Diferencias clave:
✅ HashSet
→ Sin orden, rápido en inserciones y búsquedas O(1).
✅ LinkedHashSet
→ Mantiene orden de inserción.
✅ TreeSet
→ Ordenado de forma natural o por comparador (O(log n)).
Map<K, V>
almacena pares clave-valor.
import java.util.*;
public class MapExample {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Uno", 1);
hashMap.put("Dos", 2);
hashMap.put("Tres", 3);
Map<String, Integer> linkedHashMap = new LinkedHashMap<>(hashMap); // Mantiene orden de inserción
Map<String, Integer> treeMap = new TreeMap<>(hashMap); // Ordena por clave
System.out.println("HashMap: " + hashMap);
System.out.println("LinkedHashMap: " + linkedHashMap);
System.out.println("TreeMap: " + treeMap);
}
}
📌 Diferencias clave:
✅ HashMap
→ Sin orden, rápido en búsquedas e inserciones O(1).
✅ LinkedHashMap
→ Mantiene orden de inserción.
✅ TreeMap
→ Ordena por clave automáticamente O(log n).
Las colas (Queue<E>
) siguen el modelo FIFO (First-In, First-Out).
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> priorityQueue = new PriorityQueue<>(List.of(4, 1, 3, 2));
while (!priorityQueue.isEmpty()) {
System.out.print(priorityQueue.poll() + " "); // 1 2 3 4
}
}
}
✅ La PriorityQueue
mantiene el menor elemento primero.
-
List.of()
,Set.of()
,Map.of()
→ Métodos para colecciones inmutables.
List<String> lista = List.of("A", "B", "C"); // Inmutable
Set<Integer> conjunto = Set.of(1, 2, 3); // Inmutable
Map<String, Integer> mapa = Map.of("Uno", 1, "Dos", 2); // Inmutable
Collectors.toUnmodifiableList()
en Streams
import java.util.stream.Collectors;
import java.util.List;
import java.util.stream.Stream;
List<Integer> listaInmutable = Stream.of(1, 2, 3)
.collect(Collectors.toUnmodifiableList());
- Inferencia con
var
var lista = new ArrayList<>(List.of("A", "B", "C"));
✅ Las Java Collections son eficientes, flexibles y optimizadas.
✅ Cada estructura tiene ventajas y desventajas según el caso de uso.
✅ Java 17+ añade mejoras como métodos inmutables y mejor inferencia de tipos.
Si necesitas más ejemplos avanzados o un caso de uso específico, dime. 🚀