Java HashMap 如何正确遍历并删除元素

  1. HashMap数据结构
      JDK7中HashMap是数组加链表的数据结构,HashMap源码中数组transient Node<K,V>[] table,链表transient Set<Map.Entry<K,V>> entrySet。其中Node包含hash、key、value、next四个元素。
  2. HashMap中modCount
      HashMap源码modCount成员变量的注释:The number of times this HashMap has been structurally modified,即HashMap被修改的次数。
    迭代器初始化的时候就对modCount和expectedModCount进行同步。
    删除报错的原因分析:
    1). hashmap里维护了一个modCount变量,迭代器里维护了一个expectedModCount变量,一开始两者是一样的。
    2). 每次进行hashmap.remove操作的时候就会对modCount+1,此时迭代器里的expectedModCount还是之前的值。
    3). 在下一次对迭代器进行next()调用时,判断是否HashMap.this.modCount != this.expectedModCount,如果是则抛出异常。
    删除示例,如下代码包括注释1.删除报错和注释2.正确删除两部分,具体如下:
public class HashMapTest {
    private static HashMap<Integer, String> map = new HashMap<Integer, String>();
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            map.put(i, "value" + i);
        }
        //1.删除报错
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            Integer key = entry.getKey();
            if (key % 2 == 0) {
                System.out.println("To delete key " + key);
                map.remove(key);
                System.out.println("The key " + +key + " was deleted");
            }
        }
        //2.正确删除
        Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<Integer, String> entry = it.next();
            Integer key = entry.getKey();
            if(key % 2 == 0){
                System.out.println("To delete key " + key);
                it.remove();
                System.out.println("The key " + + key + " was deleted");
            }
        }

    }

}

  1. HashMa如何正确遍历删除元素
    正确遍历删除元素的方法是,使用迭代器提供的remove方法。
    迭代器里remove了一个元素之后会对expectedModCount重新赋值,这样再次遍历的时候就不会报错了。所以正确的代码写法如:2.正确删除,直接调用迭代器的remove方法。

参考: hashmap遍历时用map.remove方法为什么会报错?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里...
    liangzzz阅读 12,422评论 7 102
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,893评论 1 14
  • 为什么要使用celery Celery是一个使用Python开发的分布式任务调度模块,因此对于大量使用Python...
    李俊伟_阅读 61,742评论 11 49
  • 偶然在朋友圈看到一段话非常感同身受,切身体会,十分认同。朋友说的,让我来总结就是这样一句话:大部分人的青春都是在正...
    鲸鱼吻着浪阅读 2,635评论 0 1
  • 从三月到八月,半年时间过去了,美国客户从皮的问题到如今彩盒的问题,交流来交流去,耳挂都还没有能完成,也许这是特别的...
    不见覔阅读 1,175评论 0 0

友情链接更多精彩内容