新聞中心
這篇文章將為大家詳細(xì)講解有關(guān)JDK7 HashMap環(huán)的產(chǎn)生原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元三亞做網(wǎng)站,已為上家服務(wù),為三亞各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
JDK7 分析
JDK7中當(dāng)我們用頭插法 對(duì)舊table
數(shù)據(jù)重定位到新table
的時(shí)候我們知道是會(huì)行程環(huán)的,環(huán)產(chǎn)生的核心函數(shù)transfer
如下,其中重點(diǎn)關(guān)注部分以標(biāo)出。
頭插法正常情況下: 并發(fā)情況下,比如我有兩個(gè)線程在同時(shí)進(jìn)行put數(shù)據(jù)跟擴(kuò)容操作,線程1只執(zhí)行了 Entry
就被掛起了,而線程2 正常執(zhí)行完畢,結(jié)果圖如下:next = e.next 線程2執(zhí)行完畢后線程1接著從原來(lái)的暫停處開(kāi)始執(zhí)行下面的語(yǔ)句:
通過(guò)逐步分析跟繪圖可以知道紅色部分會(huì)有環(huán)產(chǎn)生。JDK中HashMap是不安全的,多線程情況下要用ConcurrentHashMap。
7vs8
7中找 Hash
用了4次,8中只用了1次。7 = 數(shù)組 + 鏈表,8 = 數(shù)組 + 鏈表 + 紅黑樹(shù) 7中是頭插法,多線程容易造成環(huán),8中是尾插法。 7的擴(kuò)容是全部數(shù)據(jù)重新定位,8中是位置不變+ 移動(dòng)舊size大小來(lái)實(shí)現(xiàn)更好些。 7是先判斷是否要擴(kuò)容再插入,8中是先插入再看是否要擴(kuò)容。 HashMap
不管78都是線程不安全的,多線程情況下記得用ConcurrentHashmap
。ConcurrentHashmap
下篇文章說(shuō)。
常見(jiàn)問(wèn)題
隨機(jī)搜羅了一些常見(jiàn)HashMap
問(wèn)題,如果把HashMap都看懂了應(yīng)付這些應(yīng)該沒(méi)問(wèn)題。
HashMap原理,內(nèi)部數(shù)據(jù)結(jié)構(gòu)。 HashMap中的put,get,remove大致過(guò)程。 HashMap中 hash函數(shù)實(shí)現(xiàn)。 HashMap如何擴(kuò)容。 HashMap幾個(gè)重要參數(shù)為什么這樣設(shè)定。 HashMap為什么線程不安全,如何替換。 HashMap在JDK7跟JDK8中的區(qū)別。 HashMap中鏈表跟紅黑樹(shù)切換思路。
關(guān)于JDK7 HashMap環(huán)的產(chǎn)生原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前題目:JDK7HashMap環(huán)的產(chǎn)生原理是什么
轉(zhuǎn)載注明:http://ef60e0e.cn/article/ghehgi.html