本篇博客主要讲解了HashMap的get和remove和迭代器
相关系列
基于JDK1.8的HashMap源码解析一(变量和构造器)
基于JDK1.8的HashMap源码解析二(put和resize操作)
HashMap的get操作
1 |
|
其实HashMap的get方法还是挺简单的。先通过hash计算出key所在的bucket,在通过循环便利其中的Node判断是否包含查找的key,如果找到则返回节点的value值。
HashMap的remove操作
1 |
|
HashMap的删除方法也很简单。先计算删除的key的hash在哪个bucket,遍历链表记录要删除的节点之后把上一个节点指向要删除节点的下一个节点。
HashMap的迭代器
1 | abstract class HashIterator { |
HashMap的内部迭代器采用fail-fast模式,即快速失败模式。我们可以发现迭代器的方法中,首先判断了”modCount”是否等于内部记录的”expectedModCount”,如果不是,那么直接抛出ConcurrentModificationException。这就说明了,在使用迭代器过程中,我们是无法对HashMap进行remove和put操作的,因为这都会让我们内部的modCount改变导致和记录的expectedModCount不一致。但是我们可以使用迭代器自己的remove方法,因为调用迭代器自己的remove方法会执行删除操作并更新expectedModCount。所以我们一定要注意,不要在迭代过程中直接对HashMap进行remove操作,而应该使用迭代器的remove操作。如果你想在HashMap迭代过程中实现新增,你可以自己继承一个HashMap创建一个自己的迭代器(我并不建议这么做,因为你要解决是否还需要遍历这个节点以及如何实现)