Nivel 1 · 20 min
Colecciones de Java
El Java Collections Framework provee una arquitectura unificada para representar y manipular grupos de objetos. Elegir la estructura de datos correcta para cada caso de uso es fundamental para escribir código backend eficiente y escalable.
ArrayList vs LinkedList
ArrayList está respaldado por un array dinámico, brindando acceso aleatorio O(1) pero inserciones O(n) en posiciones arbitrarias. LinkedList usa nodos doblemente enlazados, dando inserciones O(1) en cabeza/cola pero acceso O(n) por índice. En la práctica, ArrayList supera a LinkedList en la mayoría de las cargas de trabajo gracias a la localidad de caché de CPU.
Internos de HashMap
HashMap usa un array de buckets con encadenamiento (listas enlazadas o árboles balanceados para bins con más de 8 entradas desde Java 8). La función de hash distribuye las claves entre buckets usando: index = hash(key) & (capacity - 1). Un factor de carga de 0.75 dispara el redimensionamiento al 75% de capacidad.
Trade-offs en la práctica
Usá ArrayList para lecturas aleatorias y operaciones masivas. Usá ArrayDeque (no LinkedList) para operaciones de cola/pila. Usá LinkedHashMap cuando necesités iteración en orden de inserción junto con lookups O(1). Usá TreeMap cuando necesités ordenamiento de claves con operaciones O(log n).
Code example
// HashMap pre-dimensionado para evitar rehashing
Map<String, Integer> wordCount = new HashMap<'>(1024);
// ArrayDeque como pila (más rápido que Stack/LinkedList)
Deque<String> stack = new ArrayDeque<'>();
stack.push("primero");
stack.push("segundo");
String top = stack.pop(); // "segundo"
// LinkedHashMap: caché LRU por orden de acceso
Map<String, Object> lru = new LinkedHashMap<'>(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, Object> eldest) {
return size() > 100;
}
};