使用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.mzph.cn/news/626856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.gitignore文件设置了忽略但不生效,git提交过程解析

这里写目录标题 第一章、gitignore文件设置了忽略路径&#xff0c;但是不生效1.1&#xff09;原因1.2&#xff09;解决 第一章、gitignore文件设置了忽略路径&#xff0c;但是不生效 1.1&#xff09;原因 在初次提交代码的时候&#xff0c;没有进行文件忽略&#xff0c;某些文…

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

快慢指针-Floyd判圈算法

对于环形链表是否存在环的做法&#xff0c;普通算法可以通过额外Hash数组来存储链表元素&#xff0c;直到Hash数组中出现重复元素。时间复杂度O(n)&#xff0c;空间复杂度O(n) Floyd判圈算法通过利用快慢指针的移动来实现&#xff0c;时间复杂度O&#xff08;n&#xff09;&am…

hash 路由和 history 路由的区别

Hash 路由&#xff08;Hash Routing&#xff09;&#xff1a; URL 结构&#xff1a; 使用URL中的哈希部分&#xff08;#&#xff09;来表示不同的路由。例如&#xff0c;http://example.com/#/page1。实现方式&#xff1a; 前端路由器通过监听 window.onhashchange 来判断路由的…

Java进阶之旅第三天

Java进阶之旅第三天 文章目录 Java进阶之旅第三天TreeMap特点:题目 使用TreeMap进行数据统计题目: TreeMap 特点: 1.TreeMap根TreeSet底层原理一样,都是红黑树结构2.由键决定特性: 不重复,无索引,可排序3.可排序: 对键进行牌序注意: 默认按照键的从小到大进行排序,也可以自己…

【备战蓝桥杯】今天给大家整点解压的~

【备战蓝桥杯】今天给大家整点解压的~ 蓝桥杯备赛 | 洛谷做题打卡day8 文章目录 【备战蓝桥杯】今天给大家整点解压的~ 蓝桥杯备赛 | 洛谷做题打卡day8[NOIP2017 普及组] 成绩题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提…

【C语言编程之旅 1】刷题篇-初识c语言

文章目录 第一题答案及解析 第二题答案及解析 第三题答案及解析 第四题答案及解析 第五题答案及解析 第六题答案及解析 第一题 答案及解析 C语言中内置类型包括&#xff1a; char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精…

ArcGIS Pro 拓扑编辑和常见一些拓扑错误处理

7.4 拓扑编辑 拓扑编辑也叫共享编辑&#xff0c;多个数据修改时&#xff0c;一块修改&#xff0c;如使用数据&#xff1a;chp7\拓扑检查.gdb,数据集DS下JZX、JZD和DK&#xff0c;加载地图框中&#xff0c;在“地图”选项卡下选择“地图拓扑”或“ds_Topology(地理数据库)”&…

Oracle-java下载、开源/商业许可证(收费、免费说明)、版本发布日志

Oracle-java下载、开源/商业许可证&#xff08;收费、免费说明&#xff09;、版本发布日志 下载开源/商业许可证&#xff08;收费、免费说明&#xff09;java8版本发布日志以上是一般情况&#xff0c;具体的以官网发布信息为准 下载 下载地址&#xff1a;https://www.oracle.c…

google cloud storage批量文件下载

背景&#xff1a; 一些google cloud storage文件的下载是需要付费的&#xff0c;一些是不需要的&#xff0c;不需要的直接点击下方的下载按钮即可&#xff0c;但是常常存在大量的文件下载&#xff0c;挨个下载有点费时间而且占内存&#xff0c;所以我尝试了批量下载到HPC&…

前端面试题-webpack

1.webpack是什么&#xff1f; 模块打包工具&#xff0c;用于将前端资源&#xff0c;如JavaScript、css、图片等打包成可以在浏览器运行的静态资源。可以将多个模块打包成一个或多个bundle。 主要功能&#xff1a; 模块化&#xff1a;可以将多个模块打包成一个或多个bundle&…

day17 二叉树part04

110. 平衡二叉树 简单 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 class Solution {public boolean isBalanced(TreeNode root) {re…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (3) | 正则化与最优化

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

智能代码:生成式 AI 在软件开发中的革命性角色

想象一下&#xff0c;在智能手机革命性地改变了我们的生活之后&#xff0c;现在轮到了生成式 AI 在软件开发领域掀起风暴。你知道吗&#xff0c;如果代码能自己编写自己&#xff0c;这将是多么惊人的一步&#xff1f;这就好比我们现在能轻松地用手机应用管理日常生活一样&#…

【嘉立创EDA-PCB设计指南】1.PCB基本概念及原理图绘制

前言&#xff1a;本文详解PCB基本概念以及实现MCU最小系统原理图的绘制&#xff08;原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED&#xff09;。为本专栏后面章节实现PCB绘制做准备。 最终绘制的原理图如下所示&…

代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集 、90.子集II

代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集 、90.子集II 题目 93.复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1…

2019年认证杯SPSSPRO杯数学建模B题(第二阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计和迭代匹配的未知语言文本片段提取模型 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但每段文本只是由字母…

注意!不清楚这些,2024上半年软考别轻易尝试!

看着周围的朋友们纷纷去考软考&#xff0c;很多人也跃跃欲试了吧。那我劝你&#xff0c;如果不清楚这些&#xff0c;不要轻易考2024年软考&#xff01; 01 软考介绍 软考是计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试的简称&#xff0c;由工信部、人社部领导…

面试经典150题(84-84.5)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第四十二天&#xff09;完成了1道(84)150&#xff1a; 84.&#xff08;17. 电话号码的字母组合&#xff09;题目描述&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合…