我希望将列表添加到 map ,但无法获得所需的 map 输出。 有什么方法可以获得以下所需的输出吗?
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);
预期:{1=[A], 2=[B]}
实际:{1=[B], 2=[B]}
最佳答案
即使您清除了 list
中的值,Map
仍然引用原始 list
,因此您对其所做的任何更改列表也会影响原始位置。
看一下根据您的代码修改的示例:
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);
这将打印每个字母 A
到 Z
的 Map
配对以及该字母各自的 ASCII 值。
{66=[B], 88=[X], 67=[C], 89=[Y], 68=[D]...etc...
但是,如果您将代码更改为清除
列表,就像您在print
之前的代码中所做的那样,并且仅声明一个新列表
循环外一次:
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);
现在将打印:
{66=[], 88=[], 67=[], 89=[], 68=[], 69=[], 90=[] ...etc...
Map
中的每个 List
值都是空白,因为它们都引用最后清除的相同列表。
现在看起来很明显它们都会被清除,因为在循环内部我们没有清除每次迭代的 List
,只是将每个值添加到 List
all 中在一起,所以显然 Map
引用了相同的 List
!
但是,使用 clear
与是否引用相同的 list
无关,它只是让它看起来就像您不只是添加所有将值放入同一个列表中,但您做到了。
关于java - 列出 map 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312302/