• Map中根据条件删除元素


    今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下:

    public Map processMap(Map list) {

    Map map = list;

    Iterator iter = map.keyset().iterator;

    while(iter.hasNext()) {

    double key = iter.next();

    if (key > 5)

    map.remove(key);

    }

    return map;

    }

    但是运行程序的时候却没有正常删除元素,而是提示“Java.util.ConcurrentModificationException”错误,很是疑惑,于

    是找了一些关于Map的资料发现:Map的实现不是同步的。如果程序中出现多个线程同时访问一个Map,而其中至少一个线程修改Map

    时,它必须保持外部同步。而通过查看Iterator原理发现,Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说

    Iterator在工作的时候,是不允许被迭代的对象被改变的,所以调用Iterator操作获得的对象在多线程修改Map的时候会自动失效。

    Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索

    引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。Map、List、Set等是动态

    的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始

    数据发生变化时,Iterator自己就迷失了方向。

    既然找到了问题的原因,那么如何解决呢?可以通过调用Iterator的remove(Object o)函数来移除元素。

    测试代码如下:

    public Map processMap(Map list) {

    Map map = list;

    Iterator iter = map.keyset().iterator;

    while(iter.hasNext()) {

    double key = iter.next();

    if (key > 5) {

    // map.remove(key); //java.util.ConcurrentModificationException

    iter.remove(key); // OK

    }

    }

    return map;

    }

    同时,在遍历Map过程中,调用put(key, value)函数来添加元素,也会出现同样的问题,所以同样需要使用迭代器的相应函数来添加。

    【Matlab开发】matlab删除数组中符合条件的元素与散点图绘制

    [Matlab开发]matlab删除数组中符合条件的元素与散点图绘制 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ matlab删除数组中符合条件的元素 如 …

    JavaScript向select下拉框中加入和删除元素

    JavaScript向select下拉框中加入和删除元素 1.说明 a 利用append()方法向下拉框中加入元素 b 利用remove()方法移除下拉框中最后一个元素 2.设计源代码 < …

    JavaScript向select下拉框中添加和删除元素

    JavaScript向select下拉框中添加和删除元素 1.说明 a 利用append()方法向下拉框中添加元素 b 利用remove()方法移除下拉框中最后一个元素 2.设计源码 < …

    Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题

    一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List

    STL 中 使用迭代器删除元素的问题

    在vector中删除,大家都知道,直接erase的话,这种写法很有问题.因为erase(iter)之后iter指针就变成野指针了,此时继续iter++就会出问题. for(auto iter = v. …

    Java中ArrayList的删除元素总结

    Java中循环遍历元素,一般有for循环遍历,foreach循环遍历,iterator遍历. 先定义一个List对象 List list = new ArrayList&l …

    从LIst集合中安全的删除元素

    package cn.rocker.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List …

    go语言学习–map中键值得删除

    测试 map1 中是否存在 key1: 在例子 8.1 中,我们已经见过可以使用val1 = map1[key1]的方法获取 key1 对应的值 val1.如果 map 中不存在 key1,val …

    判定map中是否存在某元素

    判断某key是否存在可以使用map的count方法来间接判定 count接受一个参数key值,返回map中key值为给定值的元素总数 map i_to_s_map …

    随机推荐

    转换一个矩阵(2维数组)为HTML Table

    matrix[row][col],比如[ [ “Name”, “Age” ], [ “Sam”, 12 ] ] function (m) { …

    推荐一款非常棒的谷歌插件—快速查看HTML页面元素的CSS样式

    一.下载地址 http://chromecj.com/web-development/2015-05/456/download.html 二.简介 CssViewer是一款快速查看当前页面元素的CSS …

    枚举esum20160530

    关于枚举 常见定义形式,类似定义结构体,先定义枚举变量类型: typedef enum{ Bit_RESET = 0, Bit_SET}BitAction; enum box{pencil,pen …

    ios之点语法

    第一个object c 程序 首先新建一个项目,“create a new Xcode project"-“OS X下的Application”-"Comman …

    利用VSTS跟Kubernetes进行CI/CD

    准备VSTS管理环境 首先我们需要到www.visualstudio.com下申请好的VSTS账号,然后在账号下创建一个用Git作为代码管理的项目 创建好项目后我们就可以利用git clone将代码库 …

    python中的双向链表实现

    引子 双向链表比之单向链表,多数操作方法的实现都没有什么不同,如is_empty, __len__, traverse, search.这些方法都没有涉及节点的变动,也就可通过继承单向链表来实现即可. …

    Shell 数组定义与获取

    Shell 数组 bash支持一维数组(不支持多维数组),并且没有限定数组的大小. 类似与 C 语言,数组元素的下标由 0 开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于 …

    2.网络编程-udp

    # 使用套接字发送udp数据import socket s = socket.socket(socket.AF_INET, SOCK_DGRAM) s.sendto(b"hello" …

    twisted 学习笔记一:事件循环

    from twisted.internet import reactor import time def printTime(): print “Current time is”, …

  • 相关阅读:
    一个好用的k8s代理工具——KtConnect
    VB6进程路径支持64位进程的路径和32位的进程路径
    【校招VIP】产品面试之职业规划
    VulnHub — CH4INRULZ_v1.0.1
    【CGAL_空间搜索与排序】3D快速求交和距离计算
    【kali-漏洞利用】(3.2)Metasploit基础(下):MSF终端利用过程
    Java 和 Kotlin 单例模式写法对比
    敏感信息防泄漏:透明加密与通信内容安全策略深度解析
    不甘于被强势厂商捆绑,中国移动未来或自研5G基站
    i.MX8M Plus开发板交叉编译qt5.15.2
  • 原文地址:https://blog.csdn.net/m0_67390963/article/details/126434968