首页 > 解决方案 > 列出地图中的值

问题描述

我希望将列表添加到地图,但无法获得所需的输出作为地图。有什么方法可以获得以下所需的输出?

    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]}

标签: javalistdictionary

解决方案


即使您清除了 中的值,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);

这将打印每个字母与该字母各自的 ASCII 值 的Map配对。AZ

{66=[B], 88=[X], 67=[C], 89=[Y], 68=[D]...等...

但是,如果您将代码更改为clear列表,就像您在之前的代码中一样,并且只在循环之外print声明一次,会发生什么情况:new List

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=[] ...等...

每个List值都在Map空白中,因为它们都引用了最后被清除的同一个列表。

现在似乎很明显,它们都将被清除,因为在循环内部我们没有清除List每次迭代,只是将每个值添加到List一起,所以很明显Map引用的是相同的List!但是, usingclear与是否引用相同的值list无关,它只是使您看起来不仅将所有值添加到同一个列表中,而且您确实这样做了。


推荐阅读