专栏名称: Java知音
专注于Java,推送技术文章,热门开源项目等。致力打造一个有实用,有情怀的Java技术公众号!
今天看啥  ›  专栏  ›  Java知音

HashMap 一边循环一边删除,上线翻车了~~

Java知音  · 公众号  · Java  · 2025-01-02 10:05
    

主要观点总结

本文主要介绍了Java中HashMap遍历操作的研究,包括使用foreach循环和Iterator迭代器的底层实现原理,以及在遍历时进行remove、put、add等操作的注意事项和原因。

关键观点总结

关键观点1: Java中HashMap遍历操作的实现方式

Java中可以使用foreach循环或Iterator迭代器来遍历HashMap。foreach循环底层是通过Iterator实现的,对于数组是使用下标遍历。

关键观点2: HashMap遍历时进行remove、put、add操作的注意事项

在遍历HashMap时,不能直接对HashMap进行remove、put、add等操作,这会导致ConcurrentModificationException异常。应该使用Iterator提供的remove方法进行操作。

关键观点3: ConcurrentModificationException异常的原因

ConcurrentModificationException异常是因为在遍历过程中,集合的内容被并发修改,导致迭代器的期望状态与实际状态不一致。

关键观点4: HashMap源码中modCount和expectedModCount的作用

在HashMap源码中,modCount表示集合被修改的次数,expectedModCount表示迭代器构造时集合的修改次数。在遍历过程中,如果这两个值不同步,就会抛出ConcurrentModificationException异常。


文章预览

前段时间,同事在代码中KW扫描的时候出现这样一条: 上面出现这样的原因是在使用foreach对HashMap进行遍历时,同时进行put赋值操作会有问题,异常 ConcurrentModificationException 。 于是帮同简单的看了一下,印象中集合类在进行遍历时同时进行删除或者添加操作时需要谨慎,一般使用迭代器进行操作。 于是告诉同事,应该使用迭代器Iterator来对集合元素进行操作。同事问我为什么?这一下子把我问蒙了?对啊,只是记得这样用不可以,但是好像自己从来没有细究过为什么? 于是今天决定把这个HashMap遍历操作好好地研究一番,防止采坑! foreach循环? java foreach 语法是在jdk1.5时加入的新特性,主要是当作for语法的一个增强,那么它的底层到底是怎么实现的呢?下面我们来好好研究一下: foreach 语法内部,对collection是用iterator迭代器来实现的,对数组是用 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览