Introdução: Por que isso é necessário?
\n\nImagine a situação: você está escrevendo um programa em Java que processa uma lista de nomes de usuários. Você usa o prático ArrayList<String> — adiciona elementos, remove, ordena. Tudo perfeito. Mas surge a necessidade de passar esses dados para uma biblioteca antiga ou um método que aceita apenas um array de strings (String[]).
Dor familiar? Se você é iniciante em Java, provavelmente já passou por isso. A pergunta "Converting 'ArrayList<String>' to 'String[]' in Java" é uma das mais populares no Stack Overflow. E não é por acaso. Coleções (ArrayList) e arrays (String[]) são dois mundos diferentes em Java. Os primeiros são flexíveis e dinâmicos, os segundos são rápidos e simples. Aprender a transformar um no outro é uma habilidade básica de qualquer desenvolvedor Java.
\n\nNeste artigo, vamos abordar todas as formas de converter ArrayList em array de strings, da mais simples à mais avançada, com exemplos práticos e explicações. Vamos lá!
\n\nO que são ArrayList e String[]? Breve introdução
\n\nAntes de converter, vamos garantir que entendemos a diferença.
\n\nArrayList<String>
\nFaz parte do Java Collections Framework. Ele:
\n- \n
- Expande dinamicamente (não é necessário especificar o tamanho antecipadamente). \n
- Possui vários métodos integrados:
add(),remove(),contains(). \n - Trabalha apenas com objetos (não com primitivos). \n
- Armazena elementos como objetos no heap. \n
String[] (array de strings)
\nÉ uma estrutura de dados nativa da linguagem. Ele:
\n- \n
- Tem comprimento fixo (definido na criação). \n
- Não possui métodos convenientes para adicionar/remover. \n
- É mais rápido no acesso direto por índice. \n
- Pode ser tanto um objeto quanto parte de varargs. \n
Por que converter? ArrayList é prático para trabalhar, enquanto o array é útil para passar para código legado ou para otimização de desempenho.
\n\nMétodo nº1: O clássico — método toArray()
\n\nA forma mais comum e recomendada. A classe ArrayList possui o método integrado toArray(). Mas há um detalhe — ele retorna um array do tipo Object[]. Nós precisamos de String[]. Para isso, usamos a versão sobrecarregada:
ArrayList<String> list = new ArrayList<>();\nlist.add("Maçã");\nlist.add("Banana");\nlist.add("Cereja");\n\n// Convertendo para String[]\nString[] array = list.toArray(new String[0]);\n\nComo funciona?
\nO método toArray(T[] a) recebe um array do tipo T. Se o array passado for grande o suficiente para conter todos os elementos da lista, eles são copiados para ele. Se não for (como no nosso caso com new String[0]), o Java cria um novo array do tamanho necessário com o tipo correspondente ao array passado.
Por que new String[0] e não new String[list.size()]?
\nIsso é motivo de debates. Antigamente, acreditava-se que new String[list.size()] era mais rápido, pois não exigia reflexão para criar um novo array. Mas as JVMs modernas (Java 6+) otimizam esse ponto. Além disso, no Java 11+, o método toArray(IntFunction) torna essa discussão obsoleta. Nosso conselho para iniciantes: use new String[0] — o código fica mais limpo e legível.
Método nº2: Cópia manual (para entendimento)
\n\nSe você quiser entender o que acontece "por baixo dos panos", pode fazer a conversão manualmente. Não é a melhor opção para produção, mas é um ótimo exemplo educacional:
\n\nArrayList<String> list = new ArrayList<>();\nlist.add("Gato");\nlist.add("Cachorro");\nlist.add("Hamster");\n\n// Criando um array do tamanho necessário\nString[] array = new String[list.size()];\n\n// Preenchendo-o em um loop\nfor (int i = 0; i < list.size(); i++)