我希望将列表添加到地图,但无法获得所需的地图输出。 有什么办法得到下面想要的输出?
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]}
答案 0 :(得分:3)
即使您清除了connected
中的值,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);
至Map
打印A
配对,并带有字母的相应ASCII值。
{66 = [B],88 = [X],67 = [C],89 = [Y],68 = [D] ...等...
但是,如果将代码更改为Z
之前的列表,而又将代码更改为clear
之前的列表,并且仅在循环外声明一次print
,会发生什么情况:
new List
现在将打印以下内容:
{66 = [],88 = [],67 = [],89 = [],68 = [],69 = [],90 = [] ...等...
每个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);
值都为List
,因为它们都引用了最后清除的 same 列表。
现在看来它们将被清除,因为在循环内我们没有清除每次迭代的Map
,而只是将每个值都添加到List
中,所以显然{ {1}}引用相同的List
!
但是,使用Map
与引用相同的List
无关,它只是使其似乎,就像您没有将所有值都添加到同一列表中一样,但您确实做到了。
答案 1 :(得分:0)
List l = new ArrayList();
Map<String, List<Object>> mp = new HashMap();
l.add("A");
mp.put("1", l);
l = new ArrayList();
l.add("B");
mp.put("2", l);
System.out.println(mp);
答案 2 :(得分:0)
列表是通过引用传递的,因此您需要创建两个不同的列表
^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]{8}$