.## 1. Introducción
- 1 2. ¿Qué es List?
- 2 3. Uso básico de List
- 2.1 Declaración e inicialización de List
- 2.2 Agregar elementos (add)
- 2.3 Obtener elementos (get)
- 2.4 Actualizar elementos (set)
- 2.5 Eliminar elementos (remove)
- 2.6 Obtener el tamaño de la List (size)
- 2.7 Verificar la existencia de un elemento (contains)
- 2.8 Resumen: Lista de operaciones básicas frecuentemente usadas
- 3 4. Ejemplos de operaciones con List
- 4 5. Diferencias y uso de ArrayList y LinkedList
- 5 6. Uso avanzado de List
- 6 7. Errores comunes y sus soluciones
- 7 8. Conclusión
- 8 Preguntas frecuentes (FAQ)
- 8.1 Q1. ¿Cuál es la diferencia entre List y Array de Java?
- 8.2 Q2. ¿Cuál debo usar, ArrayList o LinkedList?
- 8.3 Q3. ¿Puedo almacenar tipos primitivos (como int o double) en una List?
- 8.4 Q4. ¿Cómo puedo ordenar los elementos en una List?
- 8.5 Q5. ¿Qué debo hacer si quiero manejar elementos sin duplicados?
- 8.6 Q6. ¿Qué hago cuando quiero eliminar todos los elementos de una List?
- 8.7 Q7. ¿Cuáles son las operaciones más frecuentemente usadas en List?
¿Cuál es la importancia de List en Java?
En la programación Java, “List” es una estructura de datos que aparece con mucha frecuencia. Especialmente en situaciones donde se desea gestionar varios valores juntos, es más flexible y fácil de usar que los arrays, lo que la hace muy valorada en muchos escenarios prácticos.
“List” es una interfaz central en el Java Collections Framework y proporciona un mecanismo para manejar diversas situaciones mediante diferentes clases de implementación como ArrayList y LinkedList. La capacidad de realizar operaciones como agregar, eliminar, buscar y actualizar datos de forma intuitiva es una de las razones por las que List es preferida.
Propósito y público objetivo de este artículo
Este artículo explicará de forma sistemática “Java List” desde lo básico hasta temas avanzados de manera fácil de entender para principiantes. El público objetivo principal es el siguiente:
- Aquellos que están comenzando a aprender Java y no están seguros de cómo usar List
- Aquellos que desean comprender claramente la diferencia entre Array y List
- Aquellos que tienen dificultades para elegir entre ArrayList y LinkedList
- Aquellos que quieren repasar los conceptos básicos antes de usar List en la práctica
Al terminar de leer este artículo, nuestro objetivo es que adquieras una comprensión sólida de los conceptos básicos, los métodos de implementación y las operaciones específicas de List en Java, lo que te permitirá programar con confianza.
En el siguiente capítulo, comenzaremos explicando la parte básica, “¿Qué es List?”, paso a paso.
2. ¿Qué es List?
Visión general y características de List
List en Java es una interfaz de colección que mantiene los elementos en una secuencia ordenada. Sus características más importantes son que se conserva el orden de inserción de los elementos y que se pueden acceder a los elementos individuales mediante un índice (comenzando en 0).
List se proporciona como parte del Collections Framework y tiene las siguientes características:
- Permite elementos duplicados
- Puede obtener, actualizar y eliminar elementos especificando un índice
- Puede aumentar o disminuir dinámicamente la cantidad de elementos (a diferencia de los arrays, no tiene tamaño fijo)
Esto permite una manipulación flexible de datos y se utiliza con mucha frecuencia en el trabajo práctico.
Diferencia con Array
En Java, los arrays (como int[] o String[]) también existen como medio para almacenar varios valores, pero presentan varias diferencias con List.
| Comparison Item | Array | List |
|---|---|---|
| Changing number of elements | Not possible (fixed-size) | Possible (can increase/decrease dynamically) |
| Provided functionality | Minimal operations (indexed access, length retrieval) | Rich methods (add, remove, contains, etc.) |
| Type | Can handle primitive types | Object types only (wrapper classes required) |
| Type safety | Arrays checked at compile time | Can strictly specify type with Generics |
Así, List es una colección más flexible y con más funcionalidades, lo que la hace más práctica que los arrays en muchas situaciones.
Interfaz List y sus clases de implementación
Al usar List en Java, normalmente se declara una variable mediante la interfaz List y se crea una instancia con una clase específica (clase de implementación). Las clases de implementación representativas son las siguientes:
- ArrayList Estructura similar a un array, lo que permite un acceso rápido. Es fuerte para buscar datos y acceso aleatorio.
- LinkedList Implementado con una estructura de lista doblemente enlazada. Rápido para inserción y eliminación, adecuado para listas donde las operaciones son frecuentes.
- Vector Similar a ArrayList pero ligeramente más pesado al ser seguro para hilos. No se usa mucho hoy en día.
En general, ArrayList es la más utilizada a menos que exista una razón especial. Es conveniente elegir la adecuada según la comparación de rendimiento descrita más adelante, dependiendo del caso de uso.
3. Uso básico de List
Esta sección explica las operaciones básicas al usar List en Java paso a paso. Aquí utilizaremos principalmente ArrayList como ejemplo para presentar las operaciones representativas de List.
Declaración e inicialización de List
Primero, veamos la declaración e inicialización básica de un List usando ArrayList.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
}
}
Es una práctica común declarar una variable con la interfaz List e instanciarla con ArrayList. Se utilizan genéricos para especificar el tipo a almacenar (aquí, String).
Agregar elementos (add)
Para agregar elementos a una List, use el método add().
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
Esto agrega tres elementos a la List en secuencia. List preserva el orden de adición.
Obtener elementos (get)
Para obtener un elemento en un índice especificado, use get(int index).
System.out.println(fruits.get(0)); // "apple" will be displayed
Nota que los índices comienzan desde 0.
Actualizar elementos (set)
Para actualizar un elemento en una posición determinada, use set(int index, E element).
fruits.set(1, "grape"); // The second element "banana" is replaced with "grape"
Eliminar elementos (remove)
También puede eliminar elementos por un índice específico o el elemento mismo.
fruits.remove(0); // Removes the first element
fruits.remove("orange"); // Removes "orange" (only the first match)
Obtener el tamaño de la List (size)
El número actual de elementos se puede obtener con el método size().
System.out.println(fruits.size()); // Returns 2, etc.
Verificar la existencia de un elemento (contains)
Para verificar si un elemento específico está incluido en la List, use contains().
if (fruits.contains("grape")) {
System.out.println("grape is present");
}
Resumen: Lista de operaciones básicas frecuentemente usadas
| Operation | Method Example | Description |
|---|---|---|
| Addition | add("element") | Adds to the end |
| Retrieval | get(index) | References an element |
| Update | set(index, new element) | Changes the element at the specified position |
| Removal | remove(index/element) | Removes the specified element |
| Get Size | size() | Gets the number of elements |
| Check Existence | contains("element") | Checks if a specific element exists |
4. Ejemplos de operaciones con List
En este capítulo, introduciremos ejemplos prácticos de operaciones usando la List de Java. Hay muchas situaciones en las que se desea procesar elementos en una lista secuencialmente, y aquí cubriremos métodos representativos usando bucle for, bucle for mejorado y Stream API.
Iteración usando un bucle for
El método más básico es recuperar elementos usando un índice dentro de un bucle for.
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
Este método permite control fino usando el índice. Por ejemplo, es efectivo cuando se desea procesar solo elementos en índices pares.
Iteración usando un bucle for mejorado (for-each)
Si se desea procesar todos los elementos secuencialmente sin preocuparse por el índice, el bucle for mejorado es conveniente.
for (String fruit : fruits) {
System.out.println(fruit);
}
La sintaxis es simple y fácil de leer, lo que la hace uno de los métodos más comúnmente usados. Esto es suficiente para procesamiento simple.
Iteración usando expresiones lambda y Stream API
Desde Java 8, también se puede usar la sintaxis con Stream API y expresiones lambda.
fruits.stream().forEach(fruit -> System.out.println(fruit));
La fortaleza de esta notación es que múltiples procesos se pueden encadenar juntos. Por ejemplo, se puede filtrar y luego imprimir elementos fácilmente basados en criterios específicos.
fruits.stream()
.filter(fruit -> fruit.contains("a"))
.forEach(System.out::println);
En este ejemplo, imprime solo frutas que contienen «a». Esto es especialmente recomendado para aquellos que desean acostumbrarse al estilo de codificación funcional.
Elegir el método correcto
| Method | Advantages | Suitable Situations |
|---|---|---|
| Regular for loop | Allows index control | Processing that requires element numbers |
| Enhanced for loop | Simple and easy to read syntax | Simple iteration processing |
| Stream API | Strong for conditional and chained processing | When combining filtering, mapping, and reduction |
5. Diferencias y uso de ArrayList y LinkedList
Las clases representativas que implementan la interfaz List de Java son ArrayList y LinkedList. Ambas se pueden usar como List de la misma manera, pero tienen diferencias en la estructura interna y características de rendimiento, por lo que es importante usarlas apropiadamente en las situaciones correctas.
Características y casos de uso adecuados de ArrayList
ArrayList internamente usa un array dinámico (array redimensionable).
Características principales:
.
- Muy rápido para acceso aleatorio (basado en índice)
- Añadir elementos al final de la lista es rápido (promedio O(1))
- La inserción y eliminación en el medio son más lentas (O(n))
Situaciones adecuadas
- Situaciones en las que la búsqueda (
get()) es frecuente - Situaciones en las que se puede predecir, hasta cierto punto, el número de elementos de antemano
- Procesos en los que la adición/eliminación de elementos es mínima, enfocándose en la lectura
List<String> list = new ArrayList<>();
Características y casos de uso adecuados de LinkedList
LinkedList está implementado con una estructura de lista doblemente enlazada.
Características principales
- Rápido para añadir y eliminar elementos (especialmente al principio o al final)
- El acceso aleatorio (
get(index)) es lento (O(n)) - El consumo de memoria es ligeramente mayor que el de ArrayList
Situaciones adecuadas
- Situaciones en las que los elementos se insertan o eliminan con frecuencia (especialmente al principio o en el medio)
- Cuando deseas usarla como una Cola o una Pila
- Cuando te centras en la iteración y no se necesita acceso por índice
List<String> list = new LinkedList<>();
Comparación de rendimiento
La tabla siguiente muestra la complejidad temporal teórica (notación Big O) para las operaciones más usadas.
| Operation | ArrayList | LinkedList |
|---|---|---|
get(int index) | O(1) | O(n) |
add(E e) (at the end) | O(1) | O(1) |
add(int index, E e) | O(n) | O(n) |
remove(int index) | O(n) | O(n) |
| Iteration | O(n) | O(n) |
* El tiempo real de procesamiento también puede verse afectado por el tamaño de los datos, la optimización de la JVM, etc.

Puntos para diferenciar el uso práctico
- Si tratas los datos como una lista y accedes por índice, usa ArrayList
- Si la inserción/eliminación al principio o en el medio es frecuente, usa LinkedList
- Para procesos sensibles al rendimiento, siempre realiza pruebas de rendimiento y verifica
6. Uso avanzado de List
Aquí presentaremos técnicas avanzadas para usar la List de Java de forma aún más cómoda. List puede realizar diversas operaciones no solo como una simple colección de datos, sino también mediante ordenación, barajado, filtrado, transformación, etc.
Ordenar una lista (Collections.sort)
Con Collections.sort(), puedes ordenar los elementos de una List en orden ascendente. Los elementos deben implementar la interfaz Comparable.
import java.util.*;
List<String> fruits = new ArrayList<>();
fruits.add("banana");
fruits.add("apple");
fruits.add("orange");
Collections.sort(fruits);
System.out.println(fruits); // [apple, banana, orange]
Ordenar con un orden personalizado (usando Comparator)
fruits.sort(Comparator.reverseOrder()); // Sorts in descending order
Barajar una lista (Collections.shuffle)
Para reordenar los elementos aleatoriamente, puedes usar Collections.shuffle().
Collections.shuffle(fruits);
System.out.println(fruits); // [banana, orange, apple] (example)
Esto es útil cuando deseas una baraja de cartas para un juego o un orden de presentación aleatorio.
Filtrado usando Stream API (filter)
Usando Stream a partir de Java 8, puedes escribir código de forma concisa para extraer solo los elementos que cumplen una condición.
List<String> filtered = fruits.stream()
.filter(fruit -> fruit.contains("a"))
.collect(Collectors.toList());
System.out.println(filtered); // [apple, banana, orange] (depending on original content and filter)
Transformación usando Stream API (map)
Para transformar los elementos a un formato diferente, usa map().
List<Integer> lengths = fruits.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); // Lengths of each fruit name [5, 6, 6] etc.
map() es una herramienta poderosa para la conversión de formatos de datos y el preprocesamiento.
Resumen de operaciones avanzadas
| Operation | Usage Example | Main Use Cases |
|---|---|---|
| Sort | Collections.sort(list) | Sort in ascending order |
| Shuffle | Collections.shuffle(list) | Randomize the order of elements |
| Filter | stream().filter(...).collect() | Extract only elements that match a condition |
| Transform | stream().map(...).collect() | Transform the type or value of elements |
7. Errores comunes y sus soluciones
Al trabajar con List en Java, una de las cosas con las que los principiantes suelen tropezar son las “excepciones (errores)”. Aquí explicaremos específicamente los errores representativos que ocurren con frecuencia, sus causas y cómo solucionarlos.
IndexOutOfBoundsException
Causa:
Ocurre al intentar acceder a un índice que no existe.
.
List<String> list = new ArrayList<>();
list.add("apple");
System.out.println(list.get(1)); // Error: Index 1 out of bounds
Solución:
Comprueba el tamaño antes de acceder o controla el acceso con ramificaciones condicionales para asegurar que el índice sea válido.
if (list.size() > 1) {
System.out.println(list.get(1));
}
NullPointerException
Causa:
Ocurre al invocar un método sobre una List o un elemento de la List que es null.
List<String> list = null;
list.add("apple"); // NullPointerException occurs
Solución:
Verifica previamente que la variable no sea nula, o utiliza Optional, etc.
if (list != null) {
list.add("apple");
}
Además, ten cuidado de no olvidar inicializar:
List<String> list = new ArrayList<>(); // Correct initialization
ConcurrentModificationException
Causa:
Ocurre cuando la List se modifica directamente mientras se itera sobre ella usando un bucle for‑each o un Iterator.
for (String fruit : list) {
if (fruit.equals("banana")) {
list.remove(fruit); // ConcurrentModificationException
}
}
Solución:
Utiliza un Iterator para eliminar elementos de forma segura, o emplea métodos como removeIf().
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("banana")) {
it.remove(); // Safe removal
}
}
O, de forma más concisa, a partir de Java 8:
list.removeIf(fruit -> fruit.equals("banana"));
Otros puntos a tener en cuenta
- Comprobar que la List no sea nula
- Es muy frecuente declarar una variable y no usarla. La inicialización es esencial.
- Entender que los índices comienzan en 0
- Los principiantes a menudo piensan erróneamente que “el primer elemento es el índice 1”.
Resumen de contramedidas de errores
| Error Name | Primary Cause | Example Solutions |
|---|---|---|
| IndexOutOfBoundsException | Accessing a non-existent index | Check length with size() |
| NullPointerException | List or element is null | Don’t forget initialization, perform null checks |
| ConcurrentModificationException | Directly modifying the List during iteration | Operate with Iterator or utilize removeIf() |
8. Conclusión
Repaso de los conceptos básicos de List en Java
En este artículo hemos explicado, paso a paso, los conceptos básicos hasta los aspectos avanzados de List en Java. List se utiliza particularmente con frecuencia entre las colecciones de Java y es una herramienta importante para manejar datos de forma flexible.
Primero, después de comprender qué es List, aprendimos los siguientes puntos:
Listes una colección ordenada que permite duplicados y soporta operaciones por índice- Existen clases de implementación representativas como ArrayList y LinkedList, cada una con características y casos de uso diferentes
- Dominar las operaciones básicas (add, get, update, remove, search) permite una manipulación flexible de los datos
- Procesamiento iterativo adecuado a la situación, como bucles
for, bucles mejoradosfor‑eachy la API Stream - Soporta operaciones avanzadas como ordenación, filtrado y transformación
- Entender los errores comunes, sus causas y soluciones ayuda a prevenir problemas
Diferenciando el uso de ArrayList y LinkedList
Elegir qué implementación de List usar es importante y debe basarse en el contenido del procesamiento y la cantidad de datos. Los siguientes criterios pueden servir como guía:
- ArrayList: Acceso aleatorio frecuente, principalmente lectura
- LinkedList: Inserciones/eliminaciones frecuentes, el orden de acceso es importante
Hacia el aprendizaje futuro
List es solo el “punto de entrada” a las colecciones de Java. Para manejar estructuras de datos y utilidades más avanzadas, se recomienda profundizar en las siguientes clases y características:
- Set y Map: Gestión de elementos únicos, estructura de pares clave‑valor
- Clase utilitaria Collections: Ordenación, búsqueda de min/max, etc.
- Uso de la API Stream: Introducción a la programación funcional
- Comprensión de Generics: Operaciones de colección con seguridad de tipos
Dominar los conceptos básicos de List hará que tu programación en Java sea mucho más fácil de gestionar en general.
Preguntas frecuentes (FAQ)
Hemos recopilado los puntos que los principiantes suelen preguntar sobre List en Java. Seleccionamos contenido que se encuentra frecuentemente en la práctica.
Q1. ¿Cuál es la diferencia entre List y Array de Java?
A. Un array tiene un número fijo de elementos y su tamaño debe determinarse en la declaración. Por otro lado, una List tiene un tamaño variable, lo que permite la adición y eliminación flexible de elementos. Además, List viene con muchos métodos convenientes (add, remove, contains, etc.) y es superior en términos de legibilidad y mantenibilidad.
Q2. ¿Cuál debo usar, ArrayList o LinkedList?
A. ArrayList es adecuado principalmente cuando hay acceso aleatorio frecuente (recuperación por índice). LinkedList es adecuado cuando la inserción y eliminación de elementos ocurren frecuentemente. Cuando hay dudas, generalmente se recomienda comenzar con ArrayList.
Q3. ¿Puedo almacenar tipos primitivos (como int o double) en una List?
A. No directamente. Dado que la List de Java maneja solo tipos de objetos, para tipos primitivos como int, necesitas usar sus clases wrapper correspondientes (Integer, Double, etc.).
List<Integer> numbers = new ArrayList<>();
numbers.add(10); // Auto-boxed and stored as Integer type
Q4. ¿Cómo puedo ordenar los elementos en una List?
A. Puedes ordenar en orden ascendente usando Collections.sort(list). Además, si quieres ordenar en un orden personalizado, puedes especificar un Comparator para un ordenamiento flexible.
Q5. ¿Qué debo hacer si quiero manejar elementos sin duplicados?
A. List es una colección que permite duplicados. Si quieres evitar duplicados, considera usar un Set (por ejemplo, HashSet). Sin embargo, ten en cuenta que el orden no está garantizado. Si quieres eliminar duplicados mientras lo mantienes como una List, también es posible el siguiente procesamiento con Stream:
List<String> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
Q6. ¿Qué hago cuando quiero eliminar todos los elementos de una List?
A. Puedes eliminar todos los elementos de una List usando el método clear().
list.clear();
Q7. ¿Cuáles son las operaciones más frecuentemente usadas en List?
A. Las operaciones más frecuentemente usadas en la práctica son add (adición), get (recuperación), remove (eliminación) y size (obtener tamaño). Dominar estas cubrirá la mayoría del procesamiento básico.

