日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK8HashMap的扩容核心解读,尾插法

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK8HashMap的扩容核心解读,尾插法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看懂了JDK7Hashmap的擴容頭插法,及其可能產生的循環引用問題,今天看看JDK8的HashMap擴容實現。采取的是用四個結點,兩條鏈表完成重新分配位置,比較簡單有趣。解析如下:?

//如果原來的table等于null,直接返回if (oldTab != null) {//遍歷原來的table,bucketfor (int j = 0; j < oldCap; ++j) {HashMap.Node<K, V> e;//bucketif ((e = oldTab[j]) != null) {//如果當前桶位上有元素,不為nulloldTab[j] = null;//當前位置置空if (e.next == null)//如果只有一個元素e,e.next為null,直接安排e到新表新家newTab[e.hash & (newCap - 1)] = e;else if (e instanceof HashMap.TreeNode)//判斷e是不是樹形節點,也就是超過8個元素((HashMap.TreeNode<K, V>) e).split(this, newTab, j, oldCap);//else { // preserve orderHashMap.Node<K, V> loHead = null, loTail = null;//低位的頭結點,尾結點HashMap.Node<K, V> hiHead = null, hiTail = null;//高危的頭結點,尾結點HashMap.Node<K, V> next;//下個節點do {//在這個循環里,依次處理該桶上鏈表,分裂成高位鏈和低位鏈next = e.next;//后一個節點元素//如果元素的hash值,與 原來表的容量 等于0,實際上是把原來在一個桶位的元素分流//例如e.hash & 10000,值會有0和1兩種,等于0的,還是相對于原表的索引位置//等于1,把他向高位調整if ((e.hash & oldCap) == 0) {if (loTail == null)//只有第一次進來的時候,loTail為nullloHead = e;//設置頭結點位eelseloTail.next = e;//尾插loTail = e;//低位鏈指針下移} else {if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);//while循環完之后,大概會形成兩個鏈表【高位鏈hiHead--hiTail,低位鏈loHead--loTail】,最極端的情況是只有高位鏈或//只有低位鏈。拿著這兩個鏈表,插入到對應桶位,入駐新家。//判斷低位鏈中是否有元素if (loTail != null) {loTail.next = null;//干掉低位鏈尾部的next,因為e的下一個結點很可能被分到高位,所以我們要干掉這個叛徒newTab[j] = loHead;}//判斷高位鏈中是否有元素if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}

?

總結

以上是生活随笔為你收集整理的JDK8HashMap的扩容核心解读,尾插法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。