W3docs

Cómo convertir una List en un array en Java

Convierte una List de Java en un array usando toArray y enfoques basados en streams.

Una List y un array contienen los mismos elementos pero exponen APIs diferentes: una List se redimensiona y ofrece métodos ricos, mientras que un array tiene longitud fija y es lo que muchas APIs antiguas o de bajo nivel esperan. Convertir de uno al otro es una tarea de una sola línea en Java moderno — la única decisión real es qué forma se lee mejor y si necesitas un array de objetos o uno de tipos primitivos. Esta página cubre la sobrecarga tipada de toArray, la referencia a constructor de Java 11+, la ruta de stream para arrays primitivos y los peligros del toArray() sin argumentos.

La forma idiomática: toArray con un array tipado

List.toArray(T[]) devuelve un array fuertemente tipado. Pasa un array de longitud cero del tipo del elemento y deja que el JDK calcule el tamaño del resultado:

List<String> names = List.of("Ann", "Bob", "Cy");
String[] arr = names.toArray(new String[0]);

El argumento new String[0] lleva el tipo (String[]), no un búfer predimensionado. En los JVMs modernos, la forma con array vacío es la recomendada — es igual de rápida que un array del tamaño exacto y evita el error en el que un array demasiado pequeño se reasigna y uno demasiado grande deja nulls al final. Úsala siempre que necesites un array de tipo Object como String[], Integer[] o tu propia clase.

La forma de Java 11+: una referencia a constructor de array

Desde Java 11 puedes pasar una referencia a constructor de array en lugar de un array vacío literal. Dice exactamente lo que significa — "dame un String[]":

String[] arr = names.toArray(String[]::new);

Esto se compila en lo mismo que new String[0] pero se lee con más claridad. Ten en cuenta que el toArray() sin argumentos es una trampa: siempre devuelve Object[], nunca String[], por lo que hacer un cast de su resultado a String[] lanza una ClassCastException en tiempo de ejecución.

EnfoqueTipo de resultadoNotas
list.toArray(new String[0])String[]Recomendado para arrays de objetos
list.toArray(String[]::new)String[]Java 11+, forma más clara
list.toArray()Object[]Pierde el tipo del elemento; rara vez es lo que quieres
list.stream().mapToInt(...).toArray()int[]La única forma de obtener un array primitivo

Los arrays primitivos pasan por un stream

toArray solo puede producir arrays de objetos. Una List<Integer> no puede convertirse directamente en un int[] — el autoboxing no se extiende a los arrays. Usa un stream para desempaquetar cada elemento:

List<Integer> nums = List.of(10, 20, 30);
int[] prim = nums.stream().mapToInt(Integer::intValue).toArray();

El mismo patrón te da long[] (mapToLong) y double[] (mapToDouble). No existe un atajo en el JDK para arrays primitivos, por lo que el stream es la ruta idiomática.

Un ejemplo completo

Este programa ejecuta todos los enfoques en paralelo, imprime el tipo en tiempo de ejecución que el toArray sin argumentos realmente devuelve y demuestra que el array resultante es una copia independiente — editarlo no afecta a la lista original.

java— editable, runs on the server

Lo que se puede extraer de la ejecución:

  • toArray(new String[0]) y toArray(String[]::new) ambos imprimen [Ann, Bob, Cy] — son dos formas de escribir la misma conversión tipada, y puedes usar la que se lea mejor en tu base de código.
  • El toArray() sin argumentos reporta su tipo en tiempo de ejecución como Object[], no String[] — prueba concreta de que borra el tipo del elemento y por qué debes evitar hacer cast de su resultado.
  • La List<Integer> se convierte en un verdadero int[] solo después de mapToInt; el [10, 20, 30] impreso es un array primitivo, no un Integer[], por lo que no sobrevive ningún boxing.
  • Arrays.stream(prim).sum() imprime 60, confirmando que el resultado es un array primitivo utilizable que puedes pasar directamente a operaciones de stream numérico.
  • Después de a1[0] = "ZZ" el array imprime [ZZ, Bob, Cy] mientras que la lista sigue imprimiendo [Ann, Bob, Cy]toArray devuelve una copia independiente, por lo que los cambios en el array nunca se propagan de vuelta a la lista original.

Práctica

Práctica
Tienes una List<Integer> y necesitas un int[]. ¿Qué expresión lo produce correctamente?
Tienes una List<Integer> y necesitas un int[]. ¿Qué expresión lo produce correctamente?
Was this page helpful?