3

Eu preciso passar os valores que estão em minha ArrayList<String> para uma String[] pois preciso fazer um setInputData("INPUT",input).

Ou seja, quero converter a seguinte ArrayList<String> com os demais valores para um String[]:

ArrayList<String> list = new ArrayList<>();
list.add("NOME 1");
list.add("NOME 2");
list.add("NOME 3");

Converter para:

String[] input = new String[0]

Estou tentando algumas coisas, mas estou com medo de estar fazendo da forma errada.

Eu tentei isso:

String[] input = list.toArray(new String[0]);

Mas não sei se está certo porque minha dúvida é qual a necessidade de colocar o número 0 entre [0] no new String[0] e se, fazendo desta forma, será que a conversão vai ficar deste jeito: input = {null,"Nome 1","Nome 2","Nome 3"}?

0

2 Respostas 2

2

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.

1
  • 1
    Poxa muito bem explicado..... Valeu mesmo! Esse conhecimento carregarei comigo para sempre. Você abardou bem o assunto e foi muito mais além.... agradeço muito por dividir seu conhecimento comigo e com a comunidade.... Commented 29/08/2019 às 16:06
2

Amigo, você não esta conseguindo pois não esta passando o tamanho do List para seu Array, você esta criando o Array com tamanho 0.
Mude seu código de:

String[] input = list.toArray(new String[0]);

para

String[] input = list.toArray(new String[list.size()]);
5
  • Então desta forma, todos os valores que estão contido no ArrayList<String> passa para o String[] né? Commented 29/08/2019 às 10:53
  • 1
    @Andréalas isso mesmo, todos os valores do seu List (ArrayList<String>) vão para o array (String[]) Commented 29/08/2019 às 10:54
  • Poxa muito obrigado.... Valeu mesmo pela ajuda!! Commented 29/08/2019 às 10:55
  • 1
    @Andréalas Mas se fizer list.toArray(new String[0]) também funciona, veja. No caso, se vc passa um array com tamanho zero, internamente o método toArray aloca outro com o tamanho necessário, conforme descrito na documentação
    – hkotsubo
    Commented 29/08/2019 às 11:01
  • @Andréalas De qualquer forma, coloquei uma resposta detalhando melhor esse comportamento
    – hkotsubo
    Commented 29/08/2019 às 11:44

Você deve fazer log-in para responder a esta pergunta.

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .