java - 列出地图中的值
问题描述
我希望将列表添加到地图,但无法获得所需的输出作为地图。有什么方法可以获得以下所需的输出?
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);
这将打印每个字母与该字母各自的 ASCII 值 的Map
配对。A
Z
{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
无关,它只是使您看起来不仅将所有值添加到同一个列表中,而且您确实这样做了。
推荐阅读
- go - 如何使用反射设置另一个结构的字段之一的结构字段值?
- r - 将行与平均值相结合
- mysql - 无法使用 knex 创建表并将数据发送到数据库我遇到了表之间关联的问题
- clang - Nix 的 clang 不会构建 wasm
- python - 与 xlwings ws.range 一起使用时,for 循环不起作用
- java - AsyncTask 正常工作的线程规则,规则 1 和规则 5?
- angular - 使用服务将数据从非同级组件传递到 Angular 中的另一个组件
- reactjs - 如何在 Vite 配置中更改 antd 主题?
- web-scraping - 来自 Airbnb 的 Webscraping RequestGet 无法正常工作
- javascript - 我可以让用户将本地文件设置为 javascript 中 div 的背景图像吗