CodeGym /Cursos /JAVA 25 SELF /List: ArrayList y LinkedList, operaciones básicas

List: ArrayList y LinkedList, operaciones básicas

JAVA 25 SELF
Nivel 26, Lección 1
Disponible

1. Clase ArrayList

En Java, la interfaz List es un contrato: «Soy una colección ordenada de elementos y se puede obtener un elemento por su número (índice)».

Propiedades clave de la lista (List):

  • Los elementos se almacenan en un orden determinado (a diferencia de un conjunto).
  • Se pueden almacenar elementos duplicados (por ejemplo: dos veces "Vasya").
  • Se puede acceder a un elemento por índice: el primer elemento — índice 0, el segundo — 1, y así sucesivamente.
  • Se pueden añadir y eliminar elementos en cualquier posición de la lista.

La implementación más popular de la interfaz List es ArrayList. Por debajo utiliza un array normal y se amplía automáticamente a medida que crecen los datos.

¿Cómo crear un ArrayList?

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

public class Example {
    public static void main(String[] args) {
        // Creamos una lista de cadenas
        List<String> students = new ArrayList<>();
    }
}

Explicación

  • List<String> es una variable del tipo «lista de cadenas». Declaramos la variable a través de la interfaz y creamos el objeto mediante la clase concreta (ArrayList).
  • Los corchetes angulares <String> establecen el tipo de los elementos de la lista (genéricos, generics).

Métodos básicos de ArrayList (y, en general, de cualquier List):

  • add(element) — añadir un elemento al final de la lista.
  • add(index, element) — insertar un elemento en un índice concreto.
  • get(index) — obtener un elemento por índice.
  • set(index, element) — reemplazar el elemento en un índice.
  • remove(index) — eliminar un elemento por índice.
  • remove(Object) — eliminar el primer elemento encontrado que sea igual al objeto pasado.
  • size() — saber la cantidad de elementos de la lista.

Ejemplo: trabajamos con una lista de estudiantes

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

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

        // Añadimos estudiantes
        students.add("Vasya");
        students.add("Petya");
        students.add("Masha");

        // Mostramos todos los estudiantes
        System.out.println("Lista de estudiantes: " + students);

        // Obtenemos al primer estudiante
        String first = students.get(0);
        System.out.println("Primer estudiante: " + first);

        // Cambiamos el nombre del segundo estudiante
        students.set(1, "Pavel");
        System.out.println("Después del cambio: " + students);

        // Eliminamos a Masha
        students.remove("Masha");
        System.out.println("Después de eliminar a Masha: " + students);

        // Tamaño de la lista
        System.out.println("Total de estudiantes: " + students.size());
    }
}

Resultado:

Lista de estudiantes: [Vasya, Petya, Masha]
Primer estudiante: Vasya
Después del cambio: [Vasya, Pavel, Masha]
Después de eliminar a Masha: [Vasya, Pavel]
Total de estudiantes: 2

¿Cómo se relaciona esto con nuestra aplicación?
Supongamos que tenemos una aplicación para el seguimiento de tareas del estudiante. Ahora podemos almacenar la lista de tareas como List<String>, y no como un array, y añadir nuevas tareas de forma dinámica.

2. Clase LinkedList: cuando importan la velocidad de inserción y eliminación

LinkedList es una implementación alternativa de lista. Está diseñada como una cadena doblemente enlazada: cada nodo conoce el elemento anterior y el siguiente. Como en un tren: insertar un «vagón» en medio es rápido y no requiere reconstruir todo el convoy.

Creación de LinkedList

import java.util.LinkedList;
import java.util.List;

public class Example {
    public static void main(String[] args) {
        List<String> tasks = new LinkedList<>();
    }
}

Características de LinkedList

  • Inserción y eliminación rápidas al principio y en medio de la lista.
  • Acceso lento por índice (para encontrar el elemento 100 hay que recorrer la cadena).
  • Adecuado si a menudo añades/eliminas elementos no solo al final, sino también al principio o en medio.

Ejemplo: usamos LinkedList

import java.util.LinkedList;
import java.util.List;

public class TaskListDemo {
    public static void main(String[] args) {
        List<String> tasks = new LinkedList<>();

        tasks.add("Despertarse");
        tasks.add("Desayunar");
        tasks.add("Ir a clase");

        // Añadimos una tarea al principio
        tasks.add(0, "Poner la alarma");

        System.out.println("Lista de tareas: " + tasks);

        // Eliminamos la primera tarea (la más temprana)
        tasks.remove(0);

        System.out.println("Después de eliminar la primera tarea: " + tasks);
    }
}

3. Comparación de ArrayList y LinkedList

Criterio
ArrayList
LinkedList
Base Array Lista doblemente enlazada
Acceso rápido por índice Sí (O(1)) No (O(n))
Inserción/eliminación rápida al principio/en medio No (O(n)) Sí (O(1) — si se dispone de una referencia)
Inserción/eliminación rápida al final Sí (normalmente O(1)) Sí (O(1))
Memoria Menor consumo de memoria Mayor (referencias adicionales a los nodos vecinos)
Casos típicos Acceso frecuente por índice Inserciones/eliminaciones frecuentes

Regla sencilla:

  • Si necesitas acceso rápido por número, utiliza ArrayList.
  • Si a menudo añades/eliminas al principio o en medio, utiliza LinkedList.

4. Operaciones típicas con listas

Recorrer los elementos de una lista

Bucle for clásico

for (int i = 0; i < students.size(); i++) {
    System.out.println("Estudiante #" + i + ": " + students.get(i));
}

Bucle for-each (la forma más popular)

for (String name : students) {
    System.out.println("Nombre: " + name);
}

Expresión lambda (Java 8+)

students.forEach(name -> System.out.println("Nombre: " + name));

Búsqueda de elementos

  • contains(element) — devuelve true si el elemento está en la lista.
  • indexOf(element) — devuelve el índice de la primera aparición del elemento, o -1 si no se encuentra.
if (students.contains("Vasya")) {
    System.out.println("¡Vasya está en la lista!");
}
int index = students.indexOf("Vasya");
System.out.println("Índice de Vasya: " + index);

Vaciar la lista

clear() — elimina todos los elementos.

students.clear();
System.out.println("Lista después de limpiar: " + students);

5. ¿Cuándo usar ArrayList y cuándo LinkedList?

Es más fácil pensarlo así: ArrayList es bueno allí donde necesitas acceder rápidamente a los elementos por índice y la lista no cambia a menudo. Por ejemplo, una lista larga de usuarios o el historial de mensajes — principalmente lectura.

LinkedList, en cambio, es útil cuando insertas o eliminas elementos continuamente al principio/en medio. Puede ser una cola, una pila o el historial de deshacer acciones.

En la práctica se usa con más frecuencia ArrayList. Y LinkedList se queda como «una herramienta para casos puntuales»: está en el cajón, pero a veces resulta ser justo lo que necesitas.

6. Errores típicos al trabajar con listas

Error n.º 1: Salirse de los límites de la lista. La situación más habitual es acceder a un índice inexistente. Si la lista tiene tres elementos y escribes students.get(5), obtendrás IndexOutOfBoundsException. Antes de acceder, comprueba size().

Error n.º 2: Eliminar un elemento durante la iteración. Al recorrer con for-each y eliminar elementos al mismo tiempo, aparecerá ConcurrentModificationException. Para eliminaciones complejas utiliza un bucle por índice o Iterator.

Error n.º 3: Comparación incorrecta de objetos. Si almacenas tus propios objetos (por ejemplo, Student), los métodos contains y remove dependen de equals. Si no lo sobrescribes, la comparación será por referencia y no por contenido.

Error n.º 4: Uso de tipos sin parametrizar. No escribas List list = new ArrayList() — indica siempre el tipo de los elementos: List<String> list = new ArrayList<>(). Los genéricos te protegen de errores y hacen el código más claro.

1
Tarea
JAVA 25 SELF, nivel 26, lección 1
Bloqueada
Horario del estudiante 🗓️✍️
Horario del estudiante 🗓️✍️
1
Tarea
JAVA 25 SELF, nivel 26, lección 1
Bloqueada
Mi lista personal de películas "Qué ver" 🎬🍿
Mi lista personal de películas "Qué ver" 🎬🍿
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION