文档章节

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

困觉的曼巴er
 困觉的曼巴er
发布于 2016/08/05 16:07
字数 338
阅读 52
收藏 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线程16 - 新特性:同步集合

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

小米米儿小
2014/03/06
0
0
java.util.List的remove()方法

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

木子丰
2014/11/27
0
1
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

springmvc入门之映射处理器(一)

1.简析映射处理器 在spring mvc中,使用映射处理器可以把web请求映射到正确的处理器上,spring内置了很多映射处理器,而且我们也可以自定义映射处理器。下面的实例展示spring中最常用的两个映...

明理萝
4分钟前
1
1
一个破碎的人,窃机浪漫飞行后自由坠毁

简评:A sick man who needs treatment 29 岁的 Richard Russell 是西雅图机场地勤人员,上周五,在刚进入秋天的日子,他偷了一架未载客的飞机,在空中飞行独自超过一小时,甚至驾机在空中翻...

极光推送
6分钟前
0
0
linux一次性解压多个.gz或者.tar.gz文件

解压多个压缩包 对于解压多个.gz文件的,用此命令: for gz in *.gz; do gunzip $gz; done 对于解压多个.tar.gz文件的,用下面命令: for tar in *.tar.gz; do tar xvf $tar; done...

小兔纸乖乖
17分钟前
0
0
bower 安装包的使用

一,bower是什么? bower是一种包管理器,它可用于搜索、安装和卸载如JavaScript、HTML、CSS之类的网络资源。 它依赖于node.js和npm,如果要使用它需要先安装node.js和npm,因为node.js包含n...

nsns
19分钟前
0
0
EXCEL简易的进度条

在进度栏非常简单的进度控制,以下知道程序是否已完成。 Dim x As IntegerDim MyTimer As Double'Change this loop as needed.For x = 1 To 50' Do stuffApplication.StatusBar = ...

tedzheng
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部