Map的循环遍历,修改,删除

article/2025/9/23 2:25:40

预制数据

        Map<String, String> map = new HashMap<>();map.put("aaa","123");map.put("bbb","123");map.put("CCC","123");

只循环key ---> map.keyset()

for (String key : map.keySet()) {System.out.println(key);
}print:
aaa
CCC
bbb

只循环value ---> map.values()

for (String value : map.values()){System.out.println(value);
}print:
123
123
123

同时循环 key 和 value  --->  map.entrySet()   

for (Map.Entry<String, String> entry : map.entrySet()) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + " : " + value);
}print : 循环的数据其实和插入的顺序是不一样的
aaa : 123
CCC : 123
bbb : 123

同时循环 key 和 value  --->  迭代器 iterator

Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {Map.Entry<String, String> next = iterator.next();String key = next.getKey();String value = next.getValue();System.out.println(key + " : " + value);
}print:
aaa : 123
CCC : 123
bbb : 123

注意 : iterator.hasNext()用于while循环条件,判断是否还有下一个值,而iterator.next() 是调用下一个值(每次调用都会获取下一个值!),因此在每个循环里,如果需要同时获取key和value,需要先把iterator.next()作为临时变量存起来,不能同时调用两次iterator.next():

while (iterator.hasNext()) {String key = iterator.next().getKey(); // 每个循环获取两次nextString value = iterator.next().getValue(); // 只有三个值,因此第二次循环,这里报错System.out.println(key + " : " + value);
}print
aaa : 123
Exception in thread "main" java.util.NoSuchElementExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1447)at java.util.HashMap$EntryIterator.next(HashMap.java:1479)at java.util.HashMap$EntryIterator.next(HashMap.java:1477)at testMapRemoveAdd.main(testMapRemoveAdd.java:40)

map中数据的删除

1、keySet 或者是 entrySet 都不能删除数据

        for (String key : map.keySet()) {if (key.equals("CCC")) {map.remove(key);}}System.out.println(map);Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)at java.util.HashMap$KeyIterator.next(HashMap.java:1469)at testMapRemoveAdd.main(testMapRemoveAdd.java:15)
        for (Map.Entry<String, String> enrty : map.entrySet()) {if (enrty.getKey().equals("CCC")) {map.remove(enrty.getKey());}}System.out.println(map);Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)at java.util.HashMap$EntryIterator.next(HashMap.java:1479)at java.util.HashMap$EntryIterator.next(HashMap.java:1477)at testMapRemoveAdd.main(testMapRemoveAdd.java:15)

发生 ConcurrentModificationException 的原因:

简单查看源码可以得知,在对map进行操作时(put、remove等)都会  ++modCount 操作,因此在循环过程中,由于删除导致modCount变化,导致和expectedModCount预期结果不一致,就会抛出异常。

 

map中删除数据的正确操作:

1、调用iterator迭代器进行删除

Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {if (iterator.next().getKey().equals("CCC")) {iterator.remove();}
}
System.out.println(map);print:
{aaa=123, bbb=123}

2、使用java8中的removeif删除

map.keySet().removeIf(key -> key.equals("CCC"));map.values().removeIf(value -> value.equals("123"));

map中修改key的方法:

我们知道,map中如果想要修改value,那么重要执行put方法就可以了,那么如果想要修改key的值怎么办?map其实是不支持key的修改的,因此只能new一个map,循环过程中将想要修改的KV加进去,删除旧的KV,最后在将新的KV赋值进去。

Map<String, String> map1 = new HashMap<>();
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {Map.Entry<String, String> next = iterator.next();if (next.getKey().equals("CCC")) {map1.put("ccc", next.getValue());iterator.remove();}
}
map.putAll(map1);
System.out.println(map); // {aaa=123, ccc=123, bbb=123}


http://chatgpt.dhexx.cn/article/uYEO4V2d.shtml

相关文章

Java遍历Map五种方法

一、Map集合遍历日常开发最常使用&#xff0c;简单总结五种方法差异。 ①、IteratorentrySet写法【推荐JDK8以下】&#xff0c;Map.Entry是Map接口的内部接口&#xff0c;获取迭代器&#xff0c;然后依次取出每个迭代器里面的Map.Entry Iterator<Map.Entry<Integer,Strin…

443端口被占用怎么办

前段时间配置SDN的时候装了虚拟机&#xff0c;然后最近打开Steam插件访问社区的时候发现跳出错误&#xff0c;443端口被占用&#xff0c;一脸懵逼&#xff0c;后来查找资料才发现原来是虚拟机的vmware-hosted进程占用了443端口 可以通过右键计算机——服务和应用程序——服务—…

当443端口被占用时如何解决?

有时候我们的一些软件需要443端口才能运行&#xff0c;但是443被占用了&#xff0c;应当怎么结束呢&#xff1f; 1&#xff0c;打开CMD&#xff0c;输入netstat -ano回车&#xff0c;如图&#xff1a; 可以看到某程序正在占用443端口&#xff08;左边一列0.0.0.0:443,0.0.0.0代…

steamcom启动服务:443端口被占用,请关闭占用该端口的进程后再点击启动服务!

steamcom启动服务&#xff1a;443端口被占用&#xff0c;请关闭占用该端口的进程后再点击启动服务! 最近想玩玩游戏放松放松&#xff0c;但是steam有点问题&#xff0c;于是下了个插件steamcom,但在启动服务时出现了错误。 过程结果及解决方案 1、下载压缩文件并解压 2、运…

解除445端口的占用

有很多时候,我们测试的时候,会需要用到445端口。而windows默认该端口是开放的,那么我们如何关闭该端口的占用状态呢? 不是通过防火墙阻止445端口的连接来关闭,这种是阻止外部连接,但是本地445端口还是开放的。 我们这里讲的是关闭占用445端口的服务! 关闭Server服务 …

steamcommunity本地反代443端口/80端口被占用解决办法

参考了这两篇文章&#xff1a; https://www.cnblogs.com/chihirotan/p/5785339.html https://blog.csdn.net/mituan1234567/article/details/51085580 太长不看版&#xff1a; 我的电脑最近几天装了VMware&#xff0c;VMware占用了443端口导致steamcommunity无法启动。解决办…

端口被占用但实际端口没被占用

【问题描述】 启动nacos、sentinel时报端口被占用&#xff0c;使用netstat -aon|findstr 8080查找端口使用情况却发现该端口并没有被使用 【问题解决】 原出处&#xff1a;win10系统遇到了一个十分诡异的情况&#xff0c;端口明明没被占用却老是提示端口已占用-CSDN社区 原…

端口被占用如何关闭

在开发的时候有些时候会发现端口冲突的问题&#xff0c;比如最常使用的8080端口为例&#xff1a; 那么如何查询那个进程使用该端口并进行关闭呢&#xff1f; 首先进入命令行窗口输入下方的命令查看所有的端口占用情况 >netstat -ano上面一步不是必须的&#xff0c;然后输入…

VMWare Workstation 443端口被占用

问题说明及检测&#xff1a; 今天安装svn的时候提示端口占用&#xff0c; cmd –>> netstat -aon | findstr “443” 查看到进程的pid为3312 ctrl shift esc 选择服务&#xff0c;查看到进程名&#xff08;点下PID可排序&#xff09; 这个问题是处在VMware上&…

443端口占用问题

起因 科学上网有问题 呗计算机积极拒绝了 俺也不晓得是啥问题&#xff0c;就先去排查了一些问题 下面是两个链接 给我很大帮助 cmd来查看和排出433是谁在占用 VMware占用443的解决路径 查看433占用 使用cmd netstat -ano|findstr “443” 得到如下结果 然后使用 tasklist|…

VMware占用443端口冲突的解决办法

http://www.pc6.com/infoview/Article_70640.html 今天安装了一个VMware Workstation&#xff0c;发现XAMPP的Apache就启动不了。看了一下错误日志&#xff0c;似乎是VMware Workstation占用了443端口导致冲突引起的。查看了一下&#xff0c;原来VMware Workstation有个共享虚拟…

window 服务器443端口占用,443和80端口被占用win10如何解决_443和80端口被占用win10怎么处理...

我们要知道&#xff0c;443端口即网页浏览端口&#xff0c;80端口为HTTP即超文本传输协议开放的&#xff0c;这是用来保护win10系统的正常运行&#xff0c;但是病毒也能通过端口进入系统&#xff0c;最近有用户发现win10系统443和80端口被占用了&#xff0c;对此&#xff0c;小…

成功解决:443端口被vmware-host(8992)占用。请关掉占用443端口的程序或者尝试使用系统代理模式

前言 在启动一个应用程序的时候&#xff0c;显示端口被占用。有两种解决思路&#xff1a;第一修改程序的端口。第二&#xff0c;关闭已经打开的端口。其它方式暂未想到 解决方法 这里采用关闭已经打开的程序占用的端口 1、鼠标在底部状态栏右键&#xff0c;在弹出框中选择 …

一种解决常见的80/443端口被占用导致steamcommunity 302服务无法启动的方法

如题&#xff0c;详见羽翼城大佬的博客&#xff0c;其中详细分析了此问题。奈何本人频繁遇到此问题&#xff0c;而每次打开任务管理器寻找占用此端口的进程时&#xff0c;发现占用443/80端口的进程就是302程序本身&#xff0c;结束进程后重启系统也无法解决。以下是原文给出的解…

HTTPS端口443被程序vmware-hostd.exe占用的解决

环境 Windows Version: Windows 8.1 Pro 64-bit XAMPP Version: 7.3.27 Control Panel Version: 3.2.4 [ Compiled: Jun 5th 2019 ] VMware Workstation 15 Pro 现象 安装完XAMPP并启动控制面板看到如下提示&#xff1a; Port 443 in use by ""C:\Program Files…

Apache--关于443端口被占用的解决方法

安装Apache后&#xff0c;但是在启动的过程中&#xff0c;遇到443端口被占用&#xff0c;网上看了一些解决方法&#xff0c;都没有解决问题。 执行启动命令httpd -k start (出现443 端口被占用的情况) 自己查看了端口&#xff0c;netstat -aon|findstr "443" 然后查…

解决443/80端口被占用情况

查找占用端口软件 两种方法 第一种 查看当前进程连接情况&#xff1a;netstat -ano 找到占用443或者80端口的软件&#xff0c;我这已经被我杀掉了&#xff0c;所以没有&#xff0c;就只是举个例子。介绍下方法。 通过找到的进程号&#xff0c;然后就可以到任务管理器里面结…

steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

前言 时不可以苟遇&#xff0c;道不可以虚行。 今天的的前言诗句特地百度搜索了一下&#xff0c;诗句大概的意思是&#xff1a;时机是不可能随便就能遇到的&#xff0c;道路也要一步一步踏实地行走&#xff0c;象征着好运的诗句&#xff0c;之所以特地去找这样意思的诗句&#…

443端口被占用

443端口被占用 解决方案1&#xff1a; cmd命令窗口---netstat -ano # 查看所有已经在运行的端口 找到443端口 查看PID 如上图所示: ​ 使用命令 例如: taskkill /f /pid 5600 ​ 如果如下图所示依旧无法停止端口运行请尝试第二种方案 解决方案二 可以通过邮件计算机--管…

查询解决443端口占用

一、写在开头 使用Steamcommunity_302&#xff0c;启动服务时提示443/80端口占用&#xff0c;应用程序里看了一圈没发现问题&#xff0c;只好使用命令行查看哪个程序占用&#xff0c;原来是vmware-hostd程序占用了443端口 。vmware-hostd.exe程序是Vmware用于虚拟机共享和远程…