面试官抛出一个问题,让我手撕代码,还说很容易实现:
题目:
HashMap<Integer,String> map = new HashMap<Integer,String>(); map.put(0,"0"); map.put(15,"15"); map.put(1,"1"); map.put(10,"10"); 将map中key是5的倍数的键值对删除;心里想着so easy啊,没想到踩坑即将开始:
我的代码实现:
HashMap<Integer,String> map = new HashMap<Integer,String>();map.put(0,"0");map.put(15,"15");map.put(1,"1");map.put(10,"10");for(Map.Entry<Integer,String> m : map.entrySet()){Integer key = m.getKey();if(key % 5 == 0){map.remove(key);}}for(Map.Entry<Integer, String> m : map.entrySet()){System.out.println(m.getKey()+" " + m.getValue());}
结果呢(错误登场):
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)at java.util.HashMap$EntryIterator.next(HashMap.java:1471)at java.util.HashMap$EntryIterator.next(HashMap.java:1469)at com.alibaba.demo.mytask.errorDemo01.main(errorDemo01.java:14)
很明显这种删除就是错误的,当时一直找不出原因,加上前面有些地方答得不好,面试就这样凉了;
(原因稍后分析,最近忙于期末考试,太难了.......)
后来在网上查答案,后来自己重新改了改通过迭代器实现,是一种方式:
for(Iterator<Map.Entry<Integer,String>> it = map.entrySet().iterator(); it.hasNext();){Map.Entry<Integer, String> item = it.next();if(item.getKey() % 5 == 0){it.remove();}}for(Map.Entry<Integer, String> m : map.entrySet()){System.out.println(m.getKey()+" "+m.getValue());}
这样就可以找到正确的结果:
1 1