Na verdade input = list.toArray(new String[0])
funciona sem problemas, só tem um detalhe.
Segundo a documentação, o método toArray
verifica se a lista cabe no array indicado, e caso não caiba, ela aloca outro array com o tamanho necessário:
If the list fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this list
Em tradução livre:
Se a lista couber no array, é retornada neste. Caso contrário, um novo array é alocado, com o mesmo tipo do array informado, e com o tamanho desta lista.
Isso tem uma pequena implicação. Se o array tiver o tamanho igual ao da lista, os elementos são copiados diretamente nele, então eu nem preciso pegar o retorno de toArray
:
ArrayList<String> list = new ArrayList<>();
list.add("NOME 1");
list.add("NOME 2");
list.add("NOME 3");
String[] input = new String[list.size()];
// array tem o tamanho da lista, ele é modificado dentro do método
list.toArray(input);
for (String s : input) {
System.out.println(s); // imprime os 3 nomes
}
Repare que eu não atribuí o retorno de toArray
para nenhuma variável. Como o array possui tamanho suficiente para ter todos os elementos da lista, estes são copiados diretamente para o array. Este código imprime os 3 nomes:
NOME 1
NOME 2
NOME 3
Mas se o array não tiver tamanho suficiente, um novo array é alocado e retornado. Já o array que eu passei como argumento para toArray
não é modificado:
ArrayList<String> list = new ArrayList<>();
list.add("NOME 1");
list.add("NOME 2");
list.add("NOME 3");
String[] input = new String[0];
list.toArray(input);
for (String s : input) {
System.out.println(s);
}
Neste caso, o array input
não tem tamanho suficiente para conter todos os elementos da lista, então toArray
aloca outro array com o tamanho adequado e o retorna. Mas eu não atribuí este retorno em nenhuma variável, e o array input
continua vazio. Por isso este código não imprime nada.
Para que o código acima funcione corretamente, eu teria que fazer input = list.toArray(input)
.
Por fim, se o array tiver um tamanho maior que o da lista, os elementos excedentes serão nulos:
ArrayList<String> list = new ArrayList<>();
list.add("NOME 1");
list.add("NOME 2");
list.add("NOME 3");
String[] input = new String[list.size() + 10];
list.toArray(input);
for (String s : input) {
System.out.println(s);
}
Neste caso, o array tem um tamanho maior que a lista, e a saída é:
NOME 1
NOME 2
NOME 3
null
null
null
null
null
null
null
null
null
null
E neste caso, mesmo se eu fizer input = list.toArray(input)
, a saída também é a mesma. Afinal, é o que está descrito na documentação: se a lista cabe no array, os elementos são copiados diretamente para este. Então neste caso o array retornado é o mesmo que foi passado para toArray
, já que ele tem espaço de sobra para conter todos os elementos da lista.
Podemos ainda fazer outro teste, para confirmar se outro array é alocado ou não, pegando o retorno de toArray
e comparando com o array original, para saber se de fato está sendo retornado outro array ou o mesmo:
ArrayList<String> list = new ArrayList<>();
list.add("NOME 1");
list.add("NOME 2");
list.add("NOME 3");
String[] input = new String[0];
String[] other = list.toArray(input);
System.out.println(other == input);
Neste caso, o código imprime false
, pois como input
não tem tamanho suficiente para ter todos os elementos da lista, toArray
aloca outro array (que é retornado e atribuído na variável other
).
Mas se o tamanho de input
for list.size()
(ou qualquer valor maior que isso), aí o código imprime true
, pois como agora o array tem espaço para todos os elementos da lista, não é alocado um novo array.
Resumindo, se você fizer qualquer uma das alternativas abaixo:
String[] input = list.toArray(new String[0]);
String[] input = list.toArray(new String[list.size()]);
Ambas funcionam. A diferença é que a primeira vai criar 2 arrays: um com tamanho zero, e outro que é alocado internamente por toArray
, já que o array de tamanho zero não tem espaço para os elementos da lista (exceto se a lista for vazia, pois aí retorna o mesmo array). Já a segunda alternativa só vai alocar um array e retorná-lo.