Cómo convertir un array en ArrayList en Java: 4 formas con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Convertimos un array en ArrayList: por qué es un dolor de cabeza eterno para el desarrollador Java

\n\n

Cualquiera que haya escrito en Java al menos una vez se ha enfrentado a esta situación: tienes un array listo String[] o int[], pero la tarea requiere un ArrayList flexible con sus métodos add(), remove() y tamaño dinámico. Parece un detalle menor, pero precisamente esta pregunta en Stack Overflow ha acumulado decenas de miles de visitas y un montón de votos. ¿Por qué? Porque, como suele pasar en Java, hay una solución "obvia" que esconde trampas.

\n\n

En este artículo no solo te daremos el código listo. Revisaremos todas las formas de crear un ArrayList a partir de un array en Java, analizaremos sus ventajas y desventajas, el rendimiento y, lo más importante, cuándo usar cada opción. Después de leerlo, podrás elegir con confianza la herramienta adecuada para tu tarea y no toparte con un UnsupportedOperationException en el momento más inesperado.

\n\n

¡Allá vamos! (o como dicen los javistas — let's dive into the code)

\n\n

Forma 1: El clásico — Arrays.asList()

\n\n

La forma más popular y corta. Seguro la has visto:

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nList<String> fruitList = Arrays.asList(fruits);
\n\n

Se ve bonito, ¿verdad? Pero hay un detalle. El método Arrays.asList() no devuelve un java.util.ArrayList, sino su propia versión estática interna — java.util.Arrays.ArrayList. Esta es una lista de tamaño fijo que no soporta operaciones de cambio de tamaño. Si intentas hacer fruitList.add("date"), obtendrás un UnsupportedOperationException.

\n\n

Ventajas:

\n
    \n
  • Código extremadamente corto y legible.
  • \n
  • Funciona como puente entre el array y la API de colecciones.
  • \n
  • Los cambios en la lista se reflejan en el array original (y viceversa).
  • \n
\n\n

Desventajas:

\n
    \n
  • Tamaño fijo — no se pueden añadir ni eliminar elementos.
  • \n
  • La lista devuelta es un "envoltorio" sobre el array, no un ArrayList completo.
  • \n
\n\n

Cuándo usarlo: Cuando necesitas una lista solo de lectura, o cuando sabes con certeza que el tamaño no cambiará. Por ejemplo, para pasarlo a un método que acepta List<?> y no lo modifica.

\n\n

¿Cómo obtener un ArrayList completo a partir de Arrays.asList()?

\n\n

Simplemente envuelve el resultado en el constructor:

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(Arrays.asList(fruits));\nfruitList.add("date"); // Ahora funciona sin errores
\n\n

Este truco es un punto medio ideal. Usas la notación corta de Arrays.asList, pero obtienes una colección dinámica completa.

\n\n

Forma 2: Collections.addAll() — velocidad y control

\n\n

Si buscas rendimiento o simplemente quieres evitar la doble copia (primero a una lista de tamaño fijo, luego a un ArrayList), existe el método Collections.addAll():

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(fruits.length);\nCollections.addAll(fruitList, fruits);
\n\n

¿Qué ocurre aquí? Creamos directamente un ArrayList con el tamaño inicial necesario (para evitar reestructuraciones innecesarias del array interno) y luego copiamos todos los elementos en una sola pasada. El método addAll es más rápido que un bucle for, ya que llama a System.arraycopy() a bajo nivel.

\n\n

Ventajas:

\n
    \n
  • Alta velocidad — prácticamente al nivel de la copia directa de memoria.
  • \n
  • Obtienes inmediatamente un ArrayList completo con capacidad de modificación.
  • \n
  • Puedes predefinir la capacidad de la lista.
  • \n
\n\n

Desventajas:

\n
    \n
  • El código es un poco

Blogs

Book Recommendations