利用java迭代器Itetator遍历并删除HashMap中的元素问题

删除 HashMap 中的元素的方法详解与示例代码 HashMap 是 Java 中常用的键值对存储结构,它提供了一种快速的查找和插入元素的方式。根据具体的需求,选择适合的方法来删除指定的键值对或清空整个 HashMap。最后,我们打印出删除后的 HashMap,可以看到 HashMap 已经被清空,不再包含任何键值对。最后,我们打印出删除后的 HashMap,可以看到键值对 “B” 已被成功删除。在上面的示例代码中,我们首先创建了一个 HashMap,并添加了三个键值对。在上面的示例代码中,我们同样创建了一个 HashMap,并添加了三个键值对。 阅读详情
问题:
下面的代码试图利用
HashMap的Iterator对象遍历该HashMap并删除满足条件的元素(比如超时的元素),但会抛出java.util.ConcurrentModificationException异常
    public static void main(String[] args)
    {      
        HashMap<String, String> hs=new HashMap();    
        hs.put("p1", "1");
        hs.put("p2", "1");
        hs.put("p3", "1");
        hs.put("p4", "1");
        hs.put("p5", "1");
        hs.put("p6", "1");       
        Iterator it=hs.keySet().iterator();      
        while(it.hasNext())
        {
            String str=(String)it.next();               
            System.out.println(hs);   

             //逻辑处理.........         
             .............
            hs.remove(str);      
        }   
}
    原因应该是
hs.remove(str)后,it内容没变,并且it里的指针列表又重新排序,所以只要确保删除任一元素后,it保持同步更新即可:
    解决方案一:
删除任一元素后,it保持同步更新
    ............
      
Iterator it=hs.keySet().iterator();   
        while(it.hasNext())
        {
            it=hs.keySet().iterator();  
            String str=(String)it.next();               
            System.out.println(hs);   

             //逻辑处理.........         
             .............
            hs.remove(str);      
        }   

    ...........
    这样的时间复杂度明显太大(两层循环嵌套)
    解决方案二:
由于删除元素时,hs的iterator对象也重新排序,所以只要用hs的一个副本hsBack
Uackp的iterator去遍历hs即可,这样在删除hs元素时iterator就不会重排了(因为删除的是hs的元素,而不是该iterator所属的
hsBackUackp)
...................
        hsBackUp=(HashMap<String, String>)hs.clone();
        Iterator it=hsBackUp.keySet().iterator();
        System.out.println(hsBackUp);
        while(it.hasNext())
        {
            String str=(String)it.next();               
            System.out.println(hs);               
            hs.remove(str);       
        }   
.....................
    这样虽然时间复杂度小了(只有一层循环),可是空间复杂度大了(多了一个hashmap的拷贝);
    查阅api文档和相关资料后,原来iterator对象有一remove方法:
void remove()       

    Removes from the underlying collection the last element returned by the

 iterator (optional operation).  This method can be called only once per

 call to next.  The behavior of an iterator is unspecified if

 the underlying collection is modified while the iteration is in

 progress in any way other than by calling this method.

于是有下面的改进:

    解决方案三:

..............................

Iterator it=hs.keySet().iterator();      

        while(it.hasNext())

        {

            String str=(String)it.next();               

            System.out.println(hs);               

            it.remove();  

        }   

..............................
华大HC32F460 TCP Server实验 阅读详情

相关推荐

【深度学习基础】Temporal Fusion Transformer

从下向上看:全连接(Dense) → ELU(指数线性激活函数(比relu好点,有利于模型收敛)) → 全连接(Dense) → 门控线性单元(Gate)(Gated Linear Units (GLUs)) → Layernorm。:一方面,它可以进行静态上下文变量和动态变量的融合,另一方面,通过门控进行了特征选择操作,门控体现在GLU(门控线性单元)中,用了sigmoid控制信息的通过程度,具有良好的适应性,能够自动选择有效信息,自适应地调整网络复杂性。输入:主输入,可选的上下文向量c。

weixin_41838721的博客 1225

在 Java 中遍历 HashMap 的5种最佳方式

在 Java 中遍历 HashMap 的5种最佳方式

qq_44885775的博客 1139

别再到处找密钥了!手把手教你搞定Halcon 24.11/25.05的试用授权(附每月更新提醒)

本文详细介绍了Halcon 24.11/25.05试用授权的获取与配置方法,包括解密新版授权机制、快速配置指南、每月更新规律及多版本共存管理技巧。帮助开发者避免常见授权问题,提升工作效率,特别适合机器视觉领域的初学者和专业人士。

weixin_29238147的博客 1154

android hashmap remove删不掉_Java之HashMap迭代删除使用方法小结

map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,如果我们有个需求,将map中满足某些条件的元素删除掉,要怎么做呢?I. Map 迭代删除迭代删除,在不考虑并发安全的前提下,我们看下可以怎么支持1. 非常不优雅版本我们知道map并不是继承自Collection接口的,HashMap 也没有提供迭代支持,既然没法直...

weixin_42402241的博客 497

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 490

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

容器删除或添加元素后迭代器失效问题

list,set,map等以节点形式存储的容器 正确写法1: list<int>li{1,2,3,4}; for (auto it = li.begin(); it != li.end();) { if (*it == 2) { it = li.erase(it); } else { it++; } } 正确写法2: for (auto it = li.begin(); it != li.end();) { if (*it == 2) {

bureau123的博客 3033

【Bug已解决】zsh: command not found: claude 解决方案

方案适用场景推荐指数难度方案一:配置 npm 全局目录所有平台,长期使用⭐⭐⭐⭐⭐低方案二:修复 PATH 变量快速修复,不想改 npm 配置⭐⭐⭐⭐低方案三:重建软链接文件存在但链接断裂⭐⭐⭐中方案四:nvm 专属方案使用 nvm 管理多版本 Node.js⭐⭐⭐⭐低方案五:Windows 专属Windows 系统⭐⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 有问题⭐⭐⭐低根本原因。

博客 1万+

Map迭代器遍历过程中,remove报错问题

Map<String, Integer> myHashMap = new IdentityHashMap<>();//IdentityHashMap类型可以put相同key myHashMap.put("1", 1); myHashMap.put("21", 21); myHashMap.put("31", 41); myHashMap.put("51", 51); Iterator<Map.Entry<String, Integer>>

weixin_44213569的博客 1061

西安交通大学软件学院——分布式系统练习题(综合题)

摘要:本文探讨了分布式系统的核心特性与关键问题。首先阐述了分布式系统的8种透明性特性,包括访问、定位、迁移等。然后通过具体案例分析了分布式事务的回滚机制、域名解析的迭代与递归过程、不同分布式系统的异同比较。重点讨论了RPC通信中客户端/服务器崩溃的处理方法,包括消灭、再生和到期三种策略。最后介绍了Lamport时间戳算法在进程通信中的应用及问题解决方案。全文涵盖了分布式系统设计中的透明性、可靠性、一致性等核心问题。

qq_73044452的博客 204

基于R-CNN深度学习的石头剪刀布手势识别系统:数据集、模型和UI界面的完整实现

本项目的目标是开发一个基于R-CNN深度学习模型的手势识别系统,能够识别石头、剪刀、布三种手势,并通过UI界面让用户能够进行交互。数据集准备与标注:收集包含石头剪刀布手势的图像,并对其进行标注。深度学习模型构建与训练:采用R-CNN模型进行手势的识别和定位。UI界面设计:设计一个简洁的界面,用户可以上传手势图像并进行识别。R-CNN(Region Convolutional Neural Networks)是一个典型的目标检测模型。生成候选区域。

YOLO 876

对 HashMap remove 有一些元素无法清除的现象 总结(不完整版)

今天写项目的时候发现了这样的一个奇怪的现象: 下面将我写的源代码贴出来 searchedData 是我定义好的一个 并且数据put成功的一个HashMap,并且MapKey也保证了一致,也保证不会出现OutOfIndexException for (int i = JSONStrLength; i < searchedData.size(); i++) { Log

qq695181966的专栏 4036

R数据分析:潜在转化分析LTA的做法和解释(一)

之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCAR数据分析:用R语言做潜类别分析LCAMplus数据分析:潜在类别分析(LCA)流程(详细版)R数据分析:再写潜在类别分析LCA的做法与解释,今天继续给大家拓展一步。 今天要介绍的就是潜在转换分析,这个东西就是LCA的纵向版本。是一个专门用来研究质变的统计技巧。有一句话叫做量变起质变,你怎么知道质变到底发生没有?就用潜在转换分析。 Latent transition analysis is an extension of...

Codewar的博客 7703

map在遍历中删除元素,避免迭代器失效

C++:在迭代中删除map的成员 首先要清楚一点,迭代器相当于是容器上的指针,容器可以自己管理内 存,因此迭代器可能失效。 如果你在不知情的情况下使用了失效的迭代器,后果是不可预料的。可能程序立即崩掉,也可能什么事都没有发生。崩掉了算你 幸运,因为你至少知道出了问题,不然有你受的。 回到正题,我想说什么呢? 比如: 程序代码

Freeway的博客 7888

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

面试官:怎么删除 HashMap 中的元素?我一行代码搞定,赶紧拿去用!

背景 大家好,我是栈长。 前些天,栈长给大家分享了两篇有意思的文章: 带了一个 3 年的开发,不会循环删除 List 中的元素,我简直崩溃!! 面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用! 这两篇文章确实能帮助一大部分人,其中分享的一些实现技巧,编程很多年的高手也不一定用过,不管自己水平多牛,还是多谦虚好学一些,掌握多一点总不是什么坏事。 有粉丝建议栈长出一篇删除 HashMap 里面的数据,也有粉丝建议出一个系列的文章: 那这篇就分享下如何删除 HashMap 中的元素吧

Java技术栈,分享最主流的Java技术 2794

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

如何优雅的删除HashMap元素

需要注意增强的 for 循环底层使用的迭代器 Iterator,而 HashMap 是 fail-fast 原则的错误机制,所以遍历时删除元素会出现 java.util.ConcurrentModificationException 并发修改异常。通过Iterator迭代删除元素不会出现并发修改异常,但由于HashMap是线程不安全的,这时如果多个线程同时修改HashMap数据也会出现并发修改异常 ,日常使用可以先用ConcurrentHashMap封装。所以也存在第三种方法同样的问题。

青鱼入云的博客 1389

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

遍历 HashMap 的 5 种最佳方式

1. 使用 Iterator 遍历 HashMap EntrySet 2. 使用 Iterator 遍历 HashMap KeySet 3. 使用 For-each 循环遍历 HashMap 4. 使用 Lambda 表达式遍历 HashMap 5. 使用 Stream API 遍历 HashMap 我们将通过示例讨论在 Java 上遍历 HashMap 的五种最佳方法 1. 使用 Iterator 遍历 HashMap EntrySet package..

ArnoBM的博客 2113

Java之HashMap中Iterator迭代器的简介说明

Java之HashMap中Iterator迭代器的简介说明

qq_25073223的博客 1045

Java之HashMap中如何删除指定元素(key)呢?

Java之HashMap中删除指定元素(key)的方法分享

qq_25073223的博客 1万+

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会

本文总结了 3 种删除 HashMap 重复元素的方法:新创建 Map 添加不重复元素添加 Set 再删除重复元素(推荐)使用 Stream 删除重复元素实际开发过程中,可能会使用不同的遍历方式,使用哪种删除方案可以根据不同的遍历方式进行选择,但推荐使用 Set 方案,可以直接删除 Map 中的重复元素,不会创建新的 HashMap。另外,遍历集合时需要重点考虑是否有多线程修改元素的场景,可能导致的并发修改异常,参考之前文章中介绍的方案,这里不再撰述了。

2301_77463738的博客 1181

JAVA中HashMap如何删除元素

HashMap删除元素根据其遍历方式一般有两种方法,实例演示如下: 一、采用foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。 1、遍历如下: 2、此时删除HashMap中的元素,Java很有可能会在运行时抛出异常。 运行上面的代码,Java抛出了 java.util.ConcurrentModificationException 的异常。并附有如下信息。 可以推测,由于在遍历HashMap的元素过程中删除了当前所在元素,下一个待访问的元素的

xiaokanfuchen86的博客 6837

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!

新创建 Map 添加不重复元素添加 Set 再删除重复元素(推荐)使用 Stream 删除重复元素实际开发过程中,可能会使用不同的遍历方式,使用哪种删除方案可以根据不同的遍历方式进行选择,但推荐使用 Set 方案,可以直接删除 Map 中的重复元素,不会创建新的 HashMap。另外,遍历集合时需要重点考虑是否有多线程修改元素的场景,可能导致的并发修改异常,参考之前文章中介绍的方案,这里不再撰述了。欢迎 Star 学习,后面 Java 示例都会在这上面提供!

Java技术栈,分享最主流的Java技术 1774

hashmap移除元素_JAVA中HashMap如何删除元素

HashMap删除元素根据其遍历方式一般有两种方法,实例演示如下:一、采用foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。1、遍历如下:2、此时删除HashMap中的元素,Java很有可能会在运行时抛出异常。运行上面的代码,Java抛出了java.util.ConcurrentModificationException的异常。并附有如下信息。可以推测,...

weixin_42519126的博客 4457

重学Java基础篇—如何优雅的删除HashMap元素

删除键对应的条目,适用于需要基于键的条件删除。元素需要注意遍历时的安全性和代码的简洁性。根据场景选择最适合的方式,推荐优先使用。直接过滤并删除元素,代码更简洁。• 对于大数据量的Map,若需在多线程中操作,使用。在Java中优雅地删除。和迭代器方式性能接近。在遍历时通过迭代器的。

有天你会让我妒忌的 483

对数据遍历的三种方式之foreach 、for与Iterator

对数据的遍历方式有三种:for循环遍历、增强for循环遍历、Iterator迭代器遍历。 增强for循环 增强for循环是JDK1.5版本后出来的一个高级for循环,是用来专门遍历数组和集合的。内部原理其实是一个迭代器遍历也就是我们常说的foreach遍历         格式:    for(元素的数据类型  变量  : Collection集合or数组)

董盛姣 6860
上一篇: Java比较两个时间相差多少天,多少个月,多少年
下一篇: OSCache缓存监控实现
Johnny__Tang
博客等级 码龄18年 9粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值