今天在写程序过程中,需要根据判断条件删除一个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.设计源代码 &lt ...

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&sol;CD

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

python中的双向链表实现

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

Shell 数组定义与获取

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

2&period;网络编程-udp

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

twisted 学习笔记一:事件循环

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

java中map删除指定元素_Map中根据条件删除元素相关推荐

  1. linux随机删除指定文件夹中的部分数据

    linux中可以使用以下指令随机删除指定文件夹中的一定数量的数据: shred -n <次数> -u <文件或目录> -z -s <大小> 其中,-n表示覆盖的次数 ...

  2. java中map如何实现遍历_Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  3. java中map的遍历方法_Java中Map的三种遍历方式

    集合中的三种遍历方式,如下代码: import java.util.Collection; import java.util.HashMap; import java.util.Iterator; i ...

  4. python删除指定行_关于csv:删除python中的特定行和对应文件

    我想删除90%的"转向"值等于0的行.这三个图像都有一个对应的图像文件,中间,左边和右边.我也要删除它们.csv文件如下: 我编写了以下代码,以至少获取转向值为0的文件.我所需要的 ...

  5. java中map怎么取值_java中map的取值

    package com.itcast.map; import java.util.HashMap; import java.util.Map; import java.util.Set; import ...

  6. php 中 map和array,浅析php中array_map和array_walk的使用对比

    一.array_map() 1.array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空. 2.回调 ...

  7. python中map的返回值_python中map函数是什么?怎么用?

    下面给大家介绍关于map函数的使用,给大家分为几大实用类型模块,具体内容请看下文哦~ map()函数简介 Python 的map()方法,作为输入提供的迭代器的所有元素应用函数. 例如,迭代器可以是列 ...

  8. html中map标签的用法,HTML中的map和area标签

    1. 标签介绍: (1)map标签: 该标签是指图片的映射,也就是说一张可以点击的图片的映射: 属性介绍: <1> id: 中的 usemap 属性可引用 中的 id 或 name 属性( ...

  9. 表的插入、更新、删除、合并操作_17_按照条件删除表中记录

    按照条件删除表中记录 需求描述 需求:删除dept表里deptno为50的记录,但后期可通过数据库日志恢复. 解决方法:这里通过DELETE FROM TableName WHERE Columnam ...

最新文章

  1. 制造工业中的机器学习应用:I概览
  2. 【转】shell pipe与输入输出重定向的区别
  3. cgroups(7)— Linux中文手册页
  4. html源码蔡,html基础代码详解
  5. 如何在linux下运行php脚本,如何通过Linux命令行使用和运行PHP脚本
  6. MySQL数据表类型及文件结构
  7. php实现新闻管理系统,PHP基础示范:用PHP+Mysql编写简易新闻管理系统_mysql
  8. 花瓣网服务器维护一个月,花瓣网维护网站推荐-只需要这一个网站就够了
  9. 华为云obs对象存储使用教程
  10. 数字图像处理第三章-----空间域滤波
  11. SQL Server超详细使用教程——从安装到编写SQL语句
  12. 树莓派CM4基于emmc安装Ubuntu系统及初始配置
  13. MTK 驱动(61)---MT6737 Android N 平台 ----ALSA Driver
  14. uni-app 对照设计稿还原不同屏幕像素适配(iPhone X)
  15. adb连接雷电模拟器失败
  16. Android笔记:将布局转换成图片
  17. 阿里X82Y的解决方案及接口
  18. 调试工具-DEBUG
  19. 为期两个月的MATLAB与ROS联合仿真探索总结——因为热爱,所以无所畏惧
  20. 2021年金属非金属矿井通风免费试题及金属非金属矿井通风考试总结

热门文章

  1. linux下Dnw配置(mini2440)
  2. Labview 编写TCP/IP 客户端断线重连机制程序,亲测可用
  3. Credential Provider
  4. Centos7+LAMP
  5. js splice()用法
  6. 两分钟带你彻底明白机器学习中的过采样和欠采样是什么意思?
  7. 实验实例 —逻辑门设计
  8. 多表(三个表)插入与删除操作
  9. 数据库 、数据仓库、数据集市的区别与联系
  10. 如何实现在on ethernetPacket中自动回复NDP response消息