Deseo añadir a la lista de mapa, pero no puede obtener la salida deseada como un mapa. Cualquier forma de obtener la salida deseada a continuación?
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]}
Reales: {1 = [B], 2 = [B]}
A pesar de que se borran los valores en el list
, la Map
administración sigue haciendo referencia a la inicial list
, por lo que cualquier cambio que realice en esa lista afectarán a la ubicación original también.
Echar un vistazo a este ejemplo modificado a partir de su 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);
Esto imprimirá un Map
emparejamiento para cada letra A
a Z
los respectivos valores ASCII de la letra.
{66 = [B], 88 = [X], 67 = [C], 89 = [Y], 68 = [D] ... etc ...
Sin embargo lo que sucede si se cambia el código de clear
la lista como que tiene en su código justo antes de la print
y sólo declarar new List
fuera de una sola vez del bucle:
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);
Esto ahora se imprimirá la siguiente:
{66 = [], 88 = [], 67 = [], 89 = [], 68 = [], 69 = [], 90 = [] ... etc ...
Con cada List
valor en el Map
blanco debido a que todos ellos fueron haciendo referencia a la misma lista que se borra al final.
Ahora bien, puede parecer obvio que todos ellos se pueden borrar porque en el interior del bucle no nos aclaramos el List
cada iteración y apenas añaden cada valor en el List
todos juntos, por lo que claramente la Map
hace referencia a la misma List
! Sin embargo, el uso clear
no tiene nada que ver con referencia a la misma list
o no, sólo lo hace parecer como si no acaba de añadir todos los valores en la misma lista, pero lo hizo.