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

一、遍历map的四种方式:

1、使用迭代器:

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

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

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

 

转载于:https://my.oschina.net/zerzer/blog/727876

你可能感兴趣的:(java,移动开发)