大数据&云计算|炸裂,大神图解JDK容器三大将之——哈希表( 二 )
get()
HashMap的get操作执行过程的伪代码如下 , 都是经典的拉链法哈希查找的步骤 V get(key) { index = hash(key) if(table[index].key.hash == key.hash && table[index] == key) return table[index].value // 如上图中Node[2]定位到的第一个Node , 如果对比相等 , 则返回value else return findNodeOrNullFromList(key) // 从拉链中查找该key的值}复制代码
查找时同样也会需要根据当前是链表还是红黑树走不同的查询逻辑
HashMap的扩容过程
接下来重点看下HashMap的扩容过程 , 上文提到 , HashMap在put的时候 , 如果put完的哈希表节点总数达到threshold , 则会进行HashMap的扩容 , 扩容的操作过程如下图:
本文插图
resize的展开过程如下:
开辟一个新的table数组 , 大小是原来的2倍 , 即table[32]
如果当前节点没有哈希冲突 , 则直接重新计算该节点的table[]数组下标位置并且放入
如果当前节点是红黑树 , 则执行红黑树的split操作将红黑树拆成两半 , 如果拆分后的大小小于了TREEIFY_THRESHOLD阈值的话 , 降级为链表
如果当前节点是链表 , 则根据当前节点的hash & oldTable.size(如本例中为16) , 根据结果为0(low链表)或1(high链表)拆分为两个链表 , 也就是根据16的二进制位(1_0000)从右往左数第5位
low链表 , 即节点.hash & 16 == 0 , 即节点.hash第5位为0的节点保持原下标
high链表 , 即节点.hash & 16 == 1 , 即节点.hash第5位为1的节点下标=原下标+16
下图展示了扩容时链表的大致拆分过程
本文插图
本文插图
通过上文可以知道 , modCount主要是遍历请求受到影响时的处理方式 , 但是我们的代码中经常会遇到一种经典的执行情况 , 如下
for(K key : map.keySet()) { if(key == xxx) map.remove(key) // 执行完后下一轮for循环抛出ConcurrentModificationException}复制代码
这种时候我们是在一个单线程中 , 我们的目的是删掉符合判断条件的节点然后继续遍历Map , 但是这样会导致代码抛出ConcurrentModificationException异常 , 就是因为在执行了map.remove(key)之后modCount++ , 进而导致遍历开始前记录的 expectModCount != modCount , 从而抛出异常 解决的办法是通过iterator.remove()删除节点
Iterator iter = map.entrySet().iterator()while(iter.hasNext()) { Entry entry = iter.next() if(entry.key == xxx) iter.remove()}复制代码
HashMap的keySet和entrySet
在我们日常开发中经常需要对HashMap进行遍历 , 常用遍历方式有两种:keySet()和entrySet() 。这两种遍历方式返回的Set集合本质上都是HashMap的一个视图 , 这个Set本身是不存储数据的 , 只是它覆写了相关的iterator、contains等方法 , 这些方法又会去对HashMap中的table数组进行相关的查询等操作 。当我们对keySet()和entrySet()返回的Set集合进行add操作时会抛出UnsupportedOperationException 。
推荐阅读
- 智能穿戴|漫步者DreamPods体验:外观精致佩戴舒适降噪是最大惊喜
- 数据|智领云荣登“中国大数据企业50强” | 2020大数据产业生态大会盛大召开
- 大数据|华云数据荣获中国大数据50强、2020数字赋能先锋企业30强,入选大数据产业发展白皮书及百佳案例
- 驱动中国|即信Fintech智研中心:银行践行社交化运营的要诀--渠道通 交互通 数据通
- 行业互联网|华云数据荣获中国大数据50强、2020数字赋能先锋企业30强,入选大数据产业发展白皮书及百佳案例
- 技术编程|数据结构001之简介
- 行业互联网|爱数亮相第八届医药健康论坛,以数据赋能药企数字化
- 技术编程|边缘云计算到底是什么?
- 行业互联网|智领云荣登“中国大数据企业50强”| 大数据产业生态大会
- 互联网|图匠数据CTO梁柱锦:利用AI与大数据提升线下零售管理能力 | 公开课预告