注:这篇文章主要记录一下我在开发中的使用hashmap遇到的问题
hashmap遍历元素可使用foreach:
HashMapmap=new HashMap<>(); map.put("name","婷婷"); map.put("sex","女"); //使用foreach循环遍历时remove掉其中key,运行结果如下图 map.forEach((k,v)->{ map.remove("name"); });
ConcurrentModificationException是Java集合的一个快速失败(fail-fast)机制,防止多个线程同时修改同一个集合的元素。
HashMap底层就是使用的迭代器,对象在初始化的时候会将当前的modCount赋值给自身属性expectedModCount,由于循环遍历时remove会改变modCount的值但是不会改变expectedModCount的值,所以就会发生异常!
使用iterator迭代器进行remove时就不会有这种错误,原因是removeNode之后会将expectedModCount重新赋值就不会发生这种问题!
1.可以使用concurrentHashMap,运行在遍历时进行修改,删除
2.使用iterator迭代器循环遍历删除元素也是可取的
ConcurrentHashMapconcurrentHashMap=new ConcurrentHashMap(); concurrentHashMap.put("name","婷婷"); concurrentHashMap.put("sex","女"); concurrentHashMap.forEach((k,v)->{ concurrentHashMap.remove("name"); System.out.println("删除成功!"); }); concurrentHashMap.forEach((k2,v2)->{ System.out.println(v2); }); //使用迭代器遍历删除这种方式是可以的!!! for (Iterator > it = map.entrySet().iterator(); it.hasNext();){ Map.Entry item = it.next(); String name=item.getKey(); if(name.equals("name")){ it.remove(); } } for (Map.Entry item : map.entrySet()){ System.out.println(item.getKey()); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)