文档章节

遍历map出现错误java.util.ConcurrentModificationException

困觉的曼巴er
 困觉的曼巴er
发布于 2016/08/05 16:07
字数 338
阅读 172
收藏 0

一、遍历map的四种方式:

1、使用迭代器:

 Map<String,String> map = new HashMap<String,String>();
			map.put("name","xiaoming");
			map.put("age","20");
			map.put("sex","male");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
				System.out.println(iterator.next());
			}

 2、for循环遍历键,通过键得到值

for(String k : map.keySet()){
				System.out.println(k+":"+map.get(k));
			}

 3、for循环遍历,得到键值

for(Map.Entry<String,String> m : map.entrySet()){
				System.out.println(m.getKey()+":"+m.getValue());
			}

4、for循环遍历 值,无法得到键

for(String v : map.values()){
				System.out.println(v);
			}

二、map删除指定元素的问题

想要删除map中的键为"age"的元素,试图这样做:

 Map<String,String> map = new HashMap<String,String>();
			map.put("name","xiaoming");
			map.put("age","20");
			map.put("sex","male");
for(Map.Entry<String,String> m : map.entrySet()){
				if(m.getKey().equals("age")){
					map.remove(m.getKey());
				}
				
			}

 报错:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894)
    at java.util.HashMap$EntryIterator.next(HashMap.java:934)
    at java.util.HashMap$EntryIterator.next(HashMap.java:932)
    at cn.java.test.map.MapTest.main(MapTest.java:22)

原因是:HashMap是线程不安全的。

两种方法解决:

1、使用迭代器的remove方法:

Map<String,String> map = new HashMap<String,String>();
			map.put("name","xiaoming");
			map.put("age","20");
			map.put("sex","male");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
				Map.Entry<String, String> m = iterator.next();
				if(m.getKey().equals("age")){
					System.out.println("将要删除键为:"+m.getKey()+"的元素");
					iterator.remove();
					
				}
			}
System.out.println("删除后结果为:");
for(Map.Entry<String,String> m : map.entrySet()){
				System.out.println(m.getKey()+"="+m.getValue());
			}

2、使用线程安全的 ConcurrentHashMap类:

Map<String,String> map = new ConcurrentHashMap<String,String>();
            map.put("name","xiaoming");
			map.put("age","20");
			map.put("sex","male");
for(Map.Entry<String,String> m : map.entrySet()){
				if(m.getKey().equals("age")){
					map.remove(m.getKey());
				}
				
			}
System.out.println("删除后结果为:");
			for(Map.Entry<String,String> m : map.entrySet()){
				System.out.println(m.getKey()+"="+m.getValue());
			}

 

© 著作权归作者所有

共有 人打赏支持
困觉的曼巴er
粉丝 1
博文 25
码字总数 12169
作品 0
其它
程序员
私信 提问
java.util.ConcurrentModificationException异常

原文地址:ConcurrentModificationException异常解决办法作者:心灵征途java.util.ConcurrentModificationException异常(转)1、今天在写一个带缓存功能的访问代理程序时出现了java.util.C...

_flowers
2013/11/18
0
0
java.util.List的remove()方法

public static void main(String[] args) { } 如果要遍历list进行过滤,比如过滤掉值为3的 本以为这代码再简单不过,可还是掉坑里了,上面的代码这样写的话,元素3是过滤不完的,只要list中有...

木子丰
2014/11/27
0
1
JAVA线程16 - 新特性:同步集合

一、概述 传统方式下的Collection在迭代集合时,不允许对集合进行修改。 传统方式下用Collections工具类提供的synchronizedCollection方法来获得同步集合。分析该方法的实现源码:其实就是把方...

小米米儿小
2014/03/06
0
0
java.util.ConcurrentModificationException 异常解决办...

【错误原因】: 当某个线程对一个Collection / Map进行遍历时,另外一个线程对其进行了修改。 一般情况下,map里面存放的对象越多、读写越频繁,这种异常出现的几率越大。 拿我遇到的情况举例...

陈泽滨
2013/08/20
0
1
java.util.List的remove()方法使用技巧

一.list.remove(i) public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(3); list.add(4); for (i......

谢思华
2015/09/10
12.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
32分钟前
0
0
day25:比较两个文件内容|杀进程|并发备份数据库|并发进程备份mysql库|监控全国CDN网站节点|

1、有两个文件 a.txt 和 b.txt,把 a.txt 中有的但 b.txt 中没有的行找出来,并写入列 c.txt,然后计算 c 的行数; 注释:比较两个文件两个文件不同,可以用的方法:diff md5sum grep -vf $1 $...

芬野de博客
48分钟前
4
0
抓包工具Charles

背景介绍 Charles是一款很实用,界面很友好(至少跟fiddler比起来),功能强大的抓包神器,因为它是基于 java 开发的,所以跨平台,Mac、Linux、Windows下都是可以使用的,并且在Android和i...

Jack088
49分钟前
2
0
徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态...

不学无数的程序员
今天
2
0
Java 面试题目最全集合1000+ 大放送,能答对70%就去BATJTMD试试~

2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ 以下是2...

mikechen优知
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部