¿Qué es?

Las listas en Java son una de las estructuras de datos más utilizadas en el desarrollo profesional, especialmente en aplicaciones backend, servicios REST y sistemas empresariales. Dominar su uso es obligatorio para escribir código limpio, eficiente y mantenible.

En este artículo aprenderás qué son, cómo funcionan, cómo usarlas correctamente y cómo evitar errores comunes, con ejemplos claros y aplicables a proyectos reales.

¿Qué es una lista en Java?

Una lista es una colección de elementos que:

  • Mantiene un orden definido
  • Permite elementos duplicados
  • Puede crecer o reducirse dinámicamente

En Java, las listas pertenecen al Framework de Colecciones y se representan mediante la interfaz List.
La implementación más usada es ArrayList.

¿Para qué sirve una lista?

Las listas se usan cuando necesitas manejar colecciones dinámicas de datos, por ejemplo:

  • Lista de usuarios en memoria
  • Productos de un carrito de compras
  • Transacciones bancarias
  • Resultados de una consulta a base de datos
  • Datos recibidos desde una API REST

En la práctica profesional, casi todos los servicios devuelven o reciben listas.

Diagrama conceptual: List y ArrayList

Este diagrama muestra la relación entre la interfaz y su implementación:

Idea clave:
👉 Siempre programa contra la interfaz (List), no contra la implementación (ArrayList).

Conceptos clave que debes entender

  • List es una interfaz
  • ArrayList es una implementación concreta
  • Los índices empiezan en 0
  • Se accede a los elementos por posición
  • Usa genéricos para seguridad de tipos
  • El tamaño puede cambiar en tiempo de ejecución

Ejemplo correcto de declaración:

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

Operación 1: Agregar elementos a una lista

Agregar elementos es una de las operaciones más comunes.

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

public class ListaEjemplo {
    public static void main(String[] args) {
        List<String> nombres = new ArrayList<>();

        nombres.add("Juan");
        nombres.add("María");
        nombres.add("Pedro");

        System.out.println(nombres);
    }
}

Qué ocurre internamente

  • La lista aumenta su tamaño automáticamente
  • Los elementos se agregan al final
  • Se conserva el orden de inserción

Operación 2: Eliminar elementos de una lista

Java ofrece dos formas distintas de eliminar elementos, y aquí ocurren muchos errores.

Eliminar por valor

nombres.remove("María");

Eliminar por índice

nombres.remove(0);

⚠️ Cuidado:
remove(0) elimina el primer elemento, no el valor 0.

Operación 3: Recorrer una lista

Recorrido con for clásico

Útil cuando necesitas el índice.

for (int i = 0; i < nombres.size(); i++) {
    System.out.println(nombres.get(i));
}

Recorrido con for-each (recomendado)

Más limpio y legible.

for (String nombre : nombres) {
    System.out.println(nombre);
}

Reglas importantes (nivel profesional)

  • Programa siempre contra List, no contra ArrayList
  • Usa genéricos (List<Usuario>)
  • No modifiques la lista dentro de un for-each
  • Valida el tamaño antes de acceder por índice
  • Prefiere for-each para lectura

Errores comunes (muy frecuentes en entrevistas)

  • Usar índices fuera del rango
  • Modificar la lista mientras se recorre
  • No usar genéricos
  • Confundir eliminación por índice y por valor
  • Pensar que ArrayList es thread-safe (NO lo es)

Ejemplo real con objetos (nivel empresa)

class Usuario {
    private String nombre;

    public Usuario(String nombre) {
        this.nombre = nombre;
    }

    public String getNombre() {
        return nombre;
    }
}

List<Usuario> usuarios = new ArrayList<>();
usuarios.add(new Usuario("Ana"));
usuarios.add(new Usuario("Carlos"));

for (Usuario u : usuarios) {
    System.out.println(u.getNombre());
}

Este patrón se usa todo el tiempo en servicios backend.

Uso en proyectos reales

En proyectos profesionales, las listas se usan para:

  • Retornar colecciones desde servicios
  • Manejar resultados de repositorios
  • Enviar respuestas JSON
  • Procesar lotes de datos
  • Modelar relaciones uno a muchos

Ejemplo típico en backend:

List<Cuenta> cuentas = cuentaService.obtenerCuentasPorCliente(idCliente);

Conclusión

Dominar las listas en Java es fundamental para:

  • Escribir código limpio
  • Evitar errores comunes
  • Pasar entrevistas técnicas
  • Construir aplicaciones empresariales sólidas

Si entiendes bien List + ArrayList, el resto del framework de colecciones será mucho más sencillo.