Transformando array em ArrayList: por que isso é uma eterna dor de cabeça para desenvolvedores Java
\n\nTodo mundo que já escreveu em Java já se deparou com esta situação: você tem um array pronto String[] ou int[], mas a tarefa exige um ArrayList flexível com seus métodos add(), remove() e tamanho dinâmico. Parece algo simples, mas é exatamente essa pergunta que acumulou dezenas de milhares de visualizações e muitos votos no Stack Overflow. Por quê? Porque, como costuma acontecer em Java, existe uma solução "óbvia" que esconde armadilhas.
Neste artigo, não vamos apenas fornecer código pronto. Vamos percorrer todas as maneiras de criar um ArrayList a partir de um array em Java, analisar seus prós e contras, desempenho e, o mais importante, quando usar cada opção. Após a leitura, você poderá escolher com confiança a ferramenta certa para sua tarefa e não esbarrar em um UnsupportedOperationException no momento mais inesperado.
Vamos lá! (ou como dizem os javistas — let's dive into the code)
\n\nManeira 1: Clássico — Arrays.asList()
\n\nA maneira mais popular e curta. Você provavelmente já viu:
\n\nString[] fruits = {"apple", "banana", "cherry"};\nList<String> fruitList = Arrays.asList(fruits);\n\nParece bonito, né? Mas tem um detalhe. O método Arrays.asList() retorna não um java.util.ArrayList, mas sim sua própria versão estática interna — java.util.Arrays.ArrayList. Esta é uma lista de tamanho fixo que não suporta operações de redimensionamento. Se você tentar fazer fruitList.add("date"), receberá um UnsupportedOperationException.
Prós:
\n- \n
- Código extremamente curto e legível. \n
- Funciona como uma ponte entre o array e a API de coleções. \n
- Alterações na lista refletem no array original (e vice-versa). \n
Contras:
\n- \n
- Tamanho fixo — não é possível adicionar ou remover elementos. \n
- A lista retornada é um "invólucro" sobre o array, não um ArrayList completo. \n
Quando usar: Quando você precisa de uma lista somente para leitura, ou quando tem certeza de que o tamanho não mudará. Por exemplo, para passar para um método que aceita List<?> e não o modifica.
Como obter um ArrayList completo a partir de Arrays.asList()?
\n\nBasta envolver o resultado no construtor:
\n\nString[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(Arrays.asList(fruits));\nfruitList.add("date"); // Agora funciona sem erros\n\nEste truque é o meio-termo ideal. Você usa a sintaxe curta Arrays.asList, mas obtém uma coleção dinâmica completa.
Maneira 2: Collections.addAll() — velocidade e controle
\n\nSe você busca desempenho ou simplesmente quer evitar a cópia dupla (primeiro para uma lista de tamanho fixo, depois para um ArrayList), existe o método Collections.addAll():
String[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(fruits.length);\nCollections.addAll(fruitList, fruits);\n\nO que acontece aqui? Criamos imediatamente um ArrayList com o tamanho inicial necessário (para evitar reconstruções desnecessárias do array interno) e, em seguida, copiamos todos os elementos em uma única passagem. O método addAll é mais rápido que um loop for, pois chama System.arraycopy() em nível baixo.
Prós:
\n- \n
- Alta velocidade — praticamente no nível de cópia direta de memória. \n
- Obtém imediatamente um ArrayList completo com capacidade de modificação. \n
- É possível definir a capacidade inicial da lista. \n
Contras:
\n- \n
- Código um pouco