Boa noite…
Alguém pode me explicar pq não consigo adicionar um objeto no meu List que foi retornado pelo método asList?
String [] arrayDeStrings = {"Java", "Delphi", "C"};
List listaDeStrings = Arrays.asList(arrayDeStrings);
listaDeStrings.add(".Net");
//exceção de tempo de execução! <<java.lang.UnsupportedOperationException>>
Será que não consigo pq tô tentando adicionar .Net ao array? :lol:
Eu realmente não entendi.
Valeu
Opa fiquei curioso e fiz os testes, mas ao ler a documentação a minha surpresa!
Ou seja você não pode modificar a estrutura da list e sim o seu conteúdo
Abraços
Este metodo retorna um objeto do tipo da interface List, acredito que seja por isso, pois esta interface nã possui implementação para adicionar algum elemento.
String[] arrayDeStrings = {"Java", "Delphi", "C"};
List<String> listaDeStrings = Arrays.asList(arrayDeStrings);
ArrayList<String> list = new ArrayList<String>(listaDeStrings);
list.add(".Net");
for (String string : list) {
System.out.println(string);
}
Desta maneira funcionou, acredito que seja porque o ArrayList possui implementação para o metodo de adicionar. Corrigam-me se estiver errado…
Att.
[quote=71C4700]Este metodo retorna um objeto do tipo da interface List, acredito que seja por isso, pois esta interface nã possui implementação para adicionar algum elemento.
String[] arrayDeStrings = {"Java", "Delphi", "C"};
List<String> listaDeStrings = Arrays.asList(arrayDeStrings);
ArrayList<String> list = new ArrayList<String>(listaDeStrings);
list.add(".Net");
for (String string : list) {
System.out.println(string);
}
Desta maneira funcionou, acredito que seja porque o ArrayList possui implementação para o metodo de adicionar. Corrigam-me se estiver errado…
Att.[/quote]
Cara, eu fiz teste aqui também.
Deste jeito funcionou, mas ocorreu que a lista e o array agora ficaram independentes. Ou seja, se modificar um o outro não é alterado.
A minha preocupação é que no livro da Kathy não fala nada sobre isto. Será que uma questão desse tipo pode pintar na prova?
Obrigado pelas respostas!
Acho que consegui entender…
Quando usamos o método asList para alimentar uma Lista através do array, tanto a lista quanto o array ficam ligados. Não sei, mas acredito que referênciam o mesmo objeto.
Como o array não é uma estrutura dinâmica, não podemos dar um lista.add(novoElemento), pois isto alteraria a estrutura do array.
Eu cheguei a esta conclusão quando fui utilizar o método List.toArray();
List<String> lista = new ArrayList<String>();
lista.add("Corinthians"); lista.add("Campeão Brasileiro 2009");
String [] arrayDeString = new String[3];
arrayDeString = lista.toArray(arrayDeString);
Neste caso, o método List.toArray(), tanto array quanto lista ficam independentes…
arrayDeString[1] = "Campeão da Libertadore 2010"; //Não altera a lista
lista.add("Campeão do Mundo 2010"); //Ok, não dá erro algum pois não altera o array
Resumindo pelo que entendi:
O método Arrays.asList(): a Lista referência o objeto Array. Não pode dar Lista.add() pois altera a estrutura do array e isso é impossível. Ocorre exceção de tempo de execução.
O método List.toArray(): Lista e array são independente. Pode dar List.add() que não ocorre problema.
É isso, não sei se está correto o que eu pensei, mas desta forma eu consegui entender.
Obrigado.
Somente acrescentando, um exemplo para demonstrar que o array e o List ‘apontam’ para o mesmo objeto.
String[] arrayDeStrings = new String[4];
arrayDeStrings[0] = "Java";
arrayDeStrings[1] = "C";
arrayDeStrings[2] = "Scala";
List<String> listaDeStrings = Arrays.asList(arrayDeStrings);
System.out.println("Antes de inserir na última posição");
for (String string : listaDeStrings) {
System.out.println(string);
}
arrayDeStrings[3] = ".Net";
System.out.println("Depois da inserção");
for (String string : listaDeStrings) {
System.out.println(string);
}
At…
[quote=71C4700]Este metodo retorna um objeto do tipo da interface List, acredito que seja por isso, pois esta interface nã possui implementação para adicionar algum elemento.
String[] arrayDeStrings = {"Java", "Delphi", "C"};
List<String> listaDeStrings = Arrays.asList(arrayDeStrings);
ArrayList<String> list = new ArrayList<String>(listaDeStrings);
list.add(".Net");
for (String string : list) {
System.out.println(string);
}
Desta maneira funcionou, acredito que seja porque o ArrayList possui implementação para o metodo de adicionar. Corrigam-me se estiver errado…
Att.[/quote]
Não cara, o raciocínio não é esse, esse método retorna alguma implementação de List, no caso se você olhar a implementação do método ele retorna um ArayList.