ArrayList en una sola línea en Java: de principiante a experto
Imagina: estás escribiendo una prueba, creando un prototipo o simplemente quieres definir rápidamente una lista de cadenas. En Python se ve como my_list = ["a", "b", "c"]. En Java… empieza el dolor de cabeza. ¿De verdad necesitas escribir tres o cuatro líneas cada vez, llamando a add() para cada elemento? Spoiler: no. En este artículo analizaremos todas las formas de inicializar un ArrayList en una sola línea, responderemos a las preguntas más frecuentes de Stack Overflow y mostraremos qué método elegir según la tarea. ¡Allá vamos!
Este material está basado en una pregunta popular real de Stack Overflow que ha acumulado miles de visitas. Lo hemos adaptado para el aprendizaje, para que no solo copies el código, sino que entiendas por qué funciona (o no funciona).
¿Por qué la inicialización simple es un problema?
En Java existe ArrayList — un array dinámico. Pero no tiene un literal incorporado para crear con datos, como los arrays (String[] arr = {"a", "b", "c"};). Por eso los principiantes suelen escribir así:
ArrayList<String> list = new ArrayList<>();list.add("Java");list.add("Python");list.add("JavaScript");Esto funciona, pero ocupa 4 líneas. ¿Y si hay 10 elementos? ¿100? Se desea algo más compacto. Analicemos todas las formas legales y no tan legales de hacerlo en una sola línea.
Método 1: El clásico — Arrays.asList()
El método más popular que encontrarás en las respuestas de Stack Overflow:
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));Aquí primero creamos una lista de tamaño fijo con Arrays.asList(), y luego la pasamos al constructor de ArrayList. El resultado es una lista mutable completa. Se pueden añadir, eliminar y modificar elementos.
Importante: Arrays.asList() por sí mismo no devuelve un ArrayList! Devuelve su propia implementación interna de una lista de tamaño fijo. Si intentas llamar a add() sobre el resultado de Arrays.asList(), obtendrás un UnsupportedOperationException. Recuérdalo: esta es la pregunta más frecuente en entrevistas y en hilos de Stack Overflow.
¿Cuándo usarlo?
- Cuando necesitas una lista mutable.
- Cuando trabajas con Java 7 o inferior (antes de Java 9).
Método 2: Java 9+ — List.of()
A partir de Java 9, apareció el método de fábrica List.of():
List<String> immutableList = List.of("a", "b", "c");Corto, bonito, conciso. Pero hay un detalle: la lista obtenida es inmutable. No podrás añadir ni eliminar elementos. Si lo intentas, obtendrás un UnsupportedOperationException.
Si necesitas específicamente un ArrayList, envuélvelo:
ArrayList<String> list = new ArrayList<>(List.of("a", "b", "c"));Este método es preferible a Arrays.asList() si usas Java 9 o superior, ya que List.of() devuelve una lista estructuralmente inmutable (no se puede cambiar el tamaño), a diferencia de Arrays.asList(), que permite modificar elementos mediante set().
¿Cuándo usarlo?
- Java 9+
- Necesitas una sintaxis corta
- No planeas modificar la lista (o la envuelves en un
ArrayList)
Método 3: Doble inicialización (Double Brace) — antipatrón
En Stack Overflow aparece a menudo este truco. Se ve así:
ArrayList<String> list = new ArrayList<>() {{ add("a"); add("b"); add("c");}};¿Qué ocurre aquí? Creamos una clase interna anónima que hereda de ArrayLi