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.
| Enfoque | Tipo de resultado | Notas |
|---|---|---|
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.
Lo que se puede extraer de la ejecución:
toArray(new String[0])ytoArray(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 comoObject[], noString[]— 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 verdaderoint[]solo después demapToInt; el[10, 20, 30]impreso es un array primitivo, no unInteger[], por lo que no sobrevive ningún boxing. Arrays.stream(prim).sum()imprime60, 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]—toArraydevuelve una copia independiente, por lo que los cambios en el array nunca se propagan de vuelta a la lista original.