Menu

ArrayList en Java: crear, añadir, eliminar, recorrer y ordenar

Cómo usar el ArrayList de Java - la lista redimensionable que eliges en lugar de un array normal - cubriendo añadir, obtener, eliminar, tamaño, recorrer y ordenar.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Una lista que se redimensiona sola

Un array normal de Java tiene una longitud fija: si decides diez huecos, tendrás diez huecos para siempre. ArrayList es la alternativa redimensionable de java.util: crece a medida que añades y se reduce a medida que eliminas, y trae métodos prácticos para lo que realmente haces con una lista.

Fíjate en el tipo entre paréntesis angulares - List<String> - que le dice al compilador que esta lista contiene valores String. El <> (el "diamante") de la derecha permite a Java inferir el mismo tipo sin repetirlo. Y observa que importas java.util.ArrayList; no está disponible por defecto.

Declara como List, construye como ArrayList

Casi siempre verás la variable declarada con la interfaz List en lugar del ArrayList concreto:

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

Es una buena costumbre, no una regla. Programar contra la interfaz List significa que al resto de tu código no le importa qué implementación de lista usaste, así que puedes cambiarla por otra más adelante sin tocarlo. Para el uso diario, ambas se comportan igual.

Añadir, obtener y modificar

  • add(value) añade al final.
  • add(index, value) inserta en una posición, desplazando los elementos posteriores hacia la derecha.
  • get(index) lee el elemento en una posición (empezando en cero).
  • set(index, value) sobrescribe un elemento existente.

Los índices empiezan en cero, y get sobre un índice fuera de rango lanza IndexOutOfBoundsException.

Eliminar elementos

Hay una trampa clásica cuando la lista contiene Integer. remove(int) es "eliminar por índice" y remove(Object) es "eliminar por valor", así que:

List<Integer> nums = new ArrayList<>(List.of(10, 20, 30));
nums.remove(1);                      // elimina el índice 1 -> el valor 20
nums.remove(Integer.valueOf(20));    // elimina el valor 20

Envuelve el valor en Integer.valueOf(...) cuando quieras decir "elimina este valor" y no "elimina este índice".

Tamaño, contains y búsquedas de índice

List.of(...) crea rápidamente una lista inmutable; pasarla al constructor de ArrayList te da una copia mutable inicializada con esos valores.

Recorrer un ArrayList

El bucle más limpio es el for mejorado (el "for-each"):

Cuando también necesitas el índice, usa un bucle contado con size() y get(i):

Una regla: no añadas ni elimines elementos de una lista mientras un bucle for-each la está recorriendo; eso lanza ConcurrentModificationException. Para borrar elementos que coincidan de forma segura, usa removeIf:

Ordenar

Collections.sort ordena una lista en el sitio usando el orden natural (alfabético para cadenas, numérico para números):

Para órdenes personalizados, pasa un Comparator a list.sort(...); por ejemplo names.sort(Comparator.comparingInt(String::length)) para ordenar por longitud.

ArrayList contiene objetos, no primitivos

No puedes escribir ArrayList<int>. Los genéricos solo funcionan con tipos de objeto, así que usa la clase envoltorio Integer, Double, Boolean, etc.:

El autoboxing de Java convierte por ti entre int e Integer, así que esto se lee de forma natural; solo recuerda que la propia lista almacena objetos Integer.

Siguiente: HashMap

ArrayList es la herramienta adecuada cuando te importa el orden y la posición. Cuando necesitas buscar cosas por una clave - un nombre de usuario a un usuario, un código de producto a un precio - quieres un HashMap, que es la siguiente página.

Preguntas frecuentes

¿Cómo se crea un ArrayList en Java?

Decláralo con el tipo de los elementos entre paréntesis angulares y llama al constructor: ArrayList<String> names = new ArrayList<>();. El <> de la derecha (el diamante) permite a Java inferir el tipo. Normalmente declaras la variable con la interfaz List: List<String> names = new ArrayList<>();.

¿Cuál es la diferencia entre un array y un ArrayList en Java?

Un array normal tiene una longitud fija que se establece al crearlo y puede contener primitivos como int. Un ArrayList crece y se reduce automáticamente a medida que añades y eliminas elementos, solo contiene objetos (así que int pasa a ser Integer) e incluye métodos como add, remove, contains y size. Usa un array para datos primitivos de tamaño fijo; usa un ArrayList cuando el tamaño cambia.

¿Cómo se elimina un elemento de un ArrayList?

Llama a remove(index) para eliminar por posición, o a remove(object) para eliminar el primer elemento que coincida. Ten cuidado con las listas de Integer: list.remove(2) elimina el índice 2, mientras que list.remove(Integer.valueOf(2)) elimina el valor 2. Para eliminar mientras recorres la lista, usa el remove() de un Iterator o removeIf(...) para evitar una ConcurrentModificationException.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR