Desejo acrescentar lista de mapa, mas incapaz de obter o resultado desejado como um mapa. Qualquer maneira de obter a saída abaixo desejado?
List l = new ArrayList();
Map<String, List<Object>> mp = new HashMap();
l.add("A");
mp.put("1", l);
l.clear();
l.add("B");
mp.put("2", l);
System.out.println(mp);
Esperado: {1 = [A], 2 = [B]}
Actual: {1 = [B], 2 = [B]}
Mesmo que você limpar os valores no list
, a Map
ainda está referenciando o original list
, de modo que todas as alterações feitas a essa lista vai afetar o local original também.
Dê uma olhada neste exemplo modificado a partir do seu código:
Map<String, List<Object>> mp = new HashMap<>();
for (int k = 65; k <= 91; k++) {
List<Object> l = new ArrayList<>();
l.add((char)k);
mp.put(Integer.toString(k), l);
}
System.out.println(mp);
Isto irá imprimir um Map
emparelhamento para cada letra A
para Z
com os respectivos valores ASCII para a letra.
{66 = [B], 88 = [X], 67 = [C], 89 = [Y], 68 = [D] ... etc ...
No entanto o que acontece se você alterar o código para clear
a lista como você tem no seu código logo antes da print
e só declarar um new List
fora de uma única vez do loop:
Map<String, List<Object>> mp = new HashMap<>();
List<Object> l = new ArrayList<>();
for (int k = 65; k <= 91; k++) {
l.add((char)k);
mp.put(Integer.toString(k), l);
}
l.clear();
System.out.println(mp);
Isto irá agora imprimir esta:
{66 = [], 88 = [], 67 = [], 89 = [], 68 = [], 69 = [], 90 = [] ... etc ...
Com cada List
valor no Map
branco porque eles estavam todos fazendo referência a mesma lista que foi liberado no final.
Agora, pode parecer óbvio que todos iriam ser limpo porque dentro do loop não limpar a List
cada iteração e apenas adicionados a cada valor no List
todos juntos, então claramente o Map
está referenciando o mesmo List
! No entanto, usando clear
não tem nada a ver com referenciando o mesmo list
ou não, ele só faz isso parecer como se não basta adicionar todos os valores na mesma lista, mas você fez.