遍历map出现错误java.util.ConcurrentModificationException
遍历map出现错误java.util.ConcurrentModificationException
困觉的曼巴er 发表于2年前
遍历map出现错误java.util.ConcurrentModificationException
  • 发表于 2年前
  • 阅读 29
  • 收藏 0
  • 点赞 0
  • 评论 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());
			}

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 25
码字总数 12169
×
困觉的曼巴er
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: