您的位置:首页 > 编程语言 > Java开发

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

2016-08-05 00:00 483 查看
一、遍历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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐