Command Palette

Search for a command to run...

ES·EN

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).

Puntos clave

  • ArrayList gana para acceso aleatorio; ArrayDeque gana para cola/pila; LinkedList raramente gana en JVMs modernas.
  • HashMap redimensiona al 75% de factor de carga — pre-dimensioná con new HashMap'<''>'(expectedSize / 0.75 + 1) cuando el tamaño es conocido.
  • Collections.unmodifiableList() es una vista, no una copia — la lista subyacente aún puede mutarse. Usá List.copyOf() para inmutabilidad real.

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;
  }
};