文档章节

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

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

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

小米米儿小
2014/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SharedPreferences 的使用,commit和apply两个方法的区别

SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE); //第一个参数:存储文件的名称,第二个参数文件的访问权限,通常MODE_PRIVATE是私有存储 sp.edit().putString("USERNAM...

lanyu96
16分钟前
1
0
02-《Apache Tomcat 9 User Guide》之简介

1.Introduction - 介绍 For administrators and web developers alike, there are some important bits of information you should familiarize yourself with before starting out. This d......

飞鱼说编程
21分钟前
1
0
关于maven的使用,这一篇基本就够了

2.1 关于maven 每一个工具的出现都有其历史意义,而Maven的出现则是开发者对于不同的项目都要有自己的Ant构建文件,而这些文件都各不相同,而且JAR被检入CVS(Concurrent Version System),...

小小明童鞋
23分钟前
16
0
从xtrabackup完整备份恢复单个innodb表

现在大多数同学在线上采取的备份策略都是xtrabackup全备+binlog备份,那么当某天某张表意外的删除那么如何从xtrabackup全备中恢复呢?从mysql 5.6版本开始,支持可移动表空间(Transportable...

IT--小哥
27分钟前
1
0
百度AI攻城狮,用TensorFlow API训练目标检测模型(浣熊超可爱)

今天,人工智能正影响我们生产、生活的方方面面。10月10日,为期三天的2018华为全联接大会在上海拉开帷幕,此次大会以“+智能,见未来”为主题,发布了AI战略及全球领先的全栈全场景AI解决方...

Python唱情歌
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部