当前位置: 首页 > news >正文

使用Map.clear()、List.clear()方法,清空时注意!

对 Map、List 对象进行清空操作时,常常会使用 clear() 方法。
例如,清空 Map

	Map map = new HashMap();map.put("key1","value1");map.put("key2","value2");System.out.println(map.size()); //2map.clear();System.out.println(map.size()); //0

换做 List 也是同样的用法

	List list = new ArrayList<>();list.add("1");list.add("2");System.out.println(list.size()); //2list.clear();System.out.println(list.size()); //0

但是!!!

本文想要说的是,需要注意,如果使用clear()方法, Map被清空的同时,原本对Map的引用会一起被清空!!!
代码举例:

	List list = new ArrayList<>();Map map = new HashMap();List listTemp = new ArrayList<>();for(int i=0; i<3; i++){map.clear();for(int j=0; j<3; j++){listTemp.add("i="+i+";j="+j);}map.put(""+i,listTemp);list.add(map);}System.out.println(list);

这段代码也很简单,两层循环。
最里层向 listTemp 中添加数据,循环三次;
外层向 map 中添加 listTemp,key 值为循环次数的值;
每一次外层的循环都会清空之前循环的 map;
每一次外层的循环将 map 添加到外层 list 中。
根据这段代码,我们期待的结果是:

[{
0 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
1 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}]

而实际上,我们能够得到的结果是:

[{
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 0;j = 0, i = 0;j = 1, i = 0;j = 2, i = 1;j = 0, i = 1;j = 1, i = 1;j = 2, i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}]

可以看到,三条数据完全相同。
而这意味着,我们在使用clear()清空了Map之后,再次对Map进行赋值的时候,添加了原Map的List,其中元素随之发生变化。
另写部分代码验证:

	Map map = new HashMap();map.put("1","11");map.put("2","22");List<Map> list = new ArrayList<>();list.add(map);System.out.println(list);map.clear();map.put("3","33");System.out.println(list);map.put("2","22");System.out.println(list);

控制台输出为

[{1=11, 2=22}]
[{3=33}]
[{2=22, 3=33}]

由此,验证了我们的想法。

Map 是这样,List 也不例外。
将上述例子稍作改动,如下:

	List<Map> list = new ArrayList<>();List listTemp = new ArrayList<>();for(int i=0; i<3; i++){listTemp.clear();for(int j=0; j<3; j++){listTemp.add("i="+i+";j="+j);}Map map = new HashMap();map.put(""+i,listTemp);list.add(map);}System.out.println(list);

这一次的执行结果如下:

[{
0 = [i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
1 = [i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}, {
2 = [i = 2;j = 0, i = 2;j = 1, i = 2;j = 2]
}]

可以看到在外层 list中,每个map元素内部的 listTemp 都是相同的,说明同样被更新了。

总结

我们也总结得出:Map、List 若被引用,那么后续的清空、修改、增加等操作,仍会影响到原本的引用
使用的时候要注意这一点!

http://www.lryc.cn/news/281688.html

相关文章:

  • 如何配置Pycharm服务器并结合内网穿透工具实现远程开发
  • c++中的以及链表的基础使用
  • vue v-for循环拖拽排序,实现数组选中的数据拖拽后对应的子数据也进行重新排序
  • google cloud storage批量文件下载
  • easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏
  • whistle代理+mock轻松解决“页面端“测试接口没数据难题
  • HNU-计算机网络-实验5(自选)-安全相关编程实验
  • Ubuntu搭建OpenCV环境(C++)
  • R语言【paleobioDB】——pbdb_orig_ext():绘制随着时间变化而出现的新类群
  • Vue模板的理解和使用
  • mysql group_concat函数使用
  • 并发编程之三大特性及JMM内存模型
  • centos系统设置runlevel为5
  • 关于群晖ARPL界面能出现ip但是使用Synology Assistant搜索不到ip问题 及解决方法
  • mysql Linux系统云服务器配置远程访问
  • 使用WAF防御网络上的隐蔽威胁之SQL注入攻击
  • 【书生·浦语】大模型实战营——第五次课程作业
  • Unity | 渡鸦避难所-7 | 攻击碰撞检测
  • Linux Mii management/mdio子系统分析之一 总体概述
  • C语言:自定义类型——联合和枚举
  • uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户投票实现
  • 如何实现一个两栏布局,右侧自适应?三栏布局中间自适应?
  • 004 Golang-channel-practice 左右括号匹配
  • MS2351M/MS2351D:RF 检测器/控制器
  • vue中使用js-doc
  • Hive知识点
  • android自启动
  • cookie、Web Storage
  • 【rk3568】01-环境搭建
  • 编程笔记 html5cssjs 036 CSS概述