最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

HashMap面試題匯總(附答案)

  發(fā)布時(shí)間:2020-03-31 16:29:39   作者:it_noone   我要評(píng)論
這篇文章主要介紹了HashMap面試題匯總,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

1,HashMap底層存儲(chǔ)結(jié)構(gòu)

HashMap在Jdk1.7的時(shí)候采用的是數(shù)組加鏈表的數(shù)據(jù)結(jié)構(gòu),jdk1.8之后采用了數(shù)組加鏈表加紅黑樹的數(shù)據(jù)結(jié)構(gòu)。觀察源碼可知HashMap類中有一個(gè)非常重要的字段就是Node[] table,即哈希桶數(shù)組。而Node是HashMap的一個(gè)內(nèi)部類,實(shí)現(xiàn)了Map.Entry接口,本身就是一個(gè)鍵值對(duì)。

2,解決Hash沖突的方法,HashMap采用了什么方法解決Hash沖突?

HashMap使用哈希表來存儲(chǔ)數(shù)據(jù)的,當(dāng)然哈希表不可避免的就會(huì)遇到hash沖突問題,解決hash沖突的方法大致有兩種:1,開放地址法。2,鏈地址法。

1,開放地址法:當(dāng)?shù)刂钒l(fā)生沖突時(shí),按著某種方法繼續(xù)探測哈希表中的其他存儲(chǔ)單元,直到找到空位置為止。

2,鏈地址法:鏈地址法就是數(shù)組加鏈表的結(jié)合,在每一個(gè)數(shù)組元素上都有一個(gè)鏈表結(jié)構(gòu),當(dāng)?shù)刂钒l(fā)生沖突時(shí)就講數(shù)據(jù)存放在鏈表中。

而HashMap就是采用鏈地址法進(jìn)行解決hash沖突的。

3,jdk1.8的HashMap中的鏈表達(dá)到多少個(gè)時(shí)會(huì)生成紅黑樹?

HashMap用鏈地址法解決hash沖突,則當(dāng)鏈表里的長度太長就會(huì)嚴(yán)重影響HashMap的性能。于是在jdk1.8里,對(duì)數(shù)據(jù)結(jié)構(gòu)做了進(jìn)一步優(yōu)化,引入了紅黑樹,當(dāng)鏈表長度大于8的時(shí)候,鏈表就會(huì)轉(zhuǎn)成紅黑樹,利用紅黑樹快速增刪改查的特點(diǎn)提高HashMap的性能,其中會(huì)用到紅黑樹的插入、刪除、查找等算法。

3,HashMap初始值的大小和負(fù)載因子的大???

hashMap初始長度就是16,負(fù)載因子是0.75。HashMap所容納的最大數(shù)據(jù)量為:長度*負(fù)載因子。即當(dāng)長度達(dá)到這個(gè)值的時(shí)候就會(huì)發(fā)生擴(kuò)容。

4,HashMap擴(kuò)容機(jī)制

擴(kuò)容(resize)就是重新計(jì)算容量,向HashMap對(duì)象里不停的添加元素,而HashMap對(duì)象內(nèi)部的數(shù)組無法裝載更多的元素時(shí),對(duì)象就需要擴(kuò)大數(shù)組的長度,以便能裝入更多的元素。當(dāng)然Java里的數(shù)組是無法自動(dòng)擴(kuò)容的,方法是使用一個(gè)新的數(shù)組代替已有的容量小的數(shù)組,就像我們用一個(gè)小桶裝水,如果想裝更多的水,就得換大水桶。底層是resize方法中的transfer方法將原有的Entry數(shù)組的元素拷貝到新的Entry數(shù)組里,擴(kuò)容都是以2的N次冪進(jìn)行擴(kuò)容 一般是2倍。

5,HashMap線程安全問題 HashTable ConcurrentHashMap

HashMap是線程不安全的,多個(gè)線程同時(shí)寫HashMap可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要滿足線程安全可以用ConcurrentHashMap,還有一個(gè)HashTable。但是HashTable是繼承自Dictionary類,HashTable容器使用synchronized來保證線程安全,但在線程競爭激烈的情況下,HashTable的效率非常低下,ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成,采用segment分段鎖來保證線程安全。

HashTable無論key或value都不能為null,HashMap只能允許一個(gè)key為null,可以運(yùn)行多個(gè)value為null。而且HashTable是線程安全的,HashMap是線程不安全的。

6,HashMap鏈表成環(huán)

由于HashMap線程不安全的,至于為何不安全,什么時(shí)候會(huì)出現(xiàn)問題,這里來討論一下:

當(dāng)有多個(gè)線程共同操作hashMap的put方法時(shí),這個(gè)時(shí)候hashMap容量不夠了,兩個(gè)線程都去擴(kuò)容執(zhí)行resize方法,在這個(gè)時(shí)候cpu切換資源的話,會(huì)造成鏈表成環(huán)問題,死循環(huán)問題。

到此這篇關(guān)于HashMap面試題匯總(附答案)的文章就介紹到這了,更多相關(guān)HashMap面試題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • HashMap的面試題整理小結(jié)

    HashMap存儲(chǔ)鍵值對(duì)實(shí)現(xiàn)快速存取,允許為null。key值不可重復(fù),若key值重復(fù)則覆蓋。本文給大家分享HashMap的面試題,非常不錯(cuò)是小編日常收集整理,具有一定的參考借鑒價(jià)值,
    2020-02-17

最新評(píng)論

上犹县| 涟源市| 台江县| 辉县市| 靖西县| 广安市| 阳谷县| 日照市| 龙海市| 阿拉善盟| 连江县| 霍邱县| 太仆寺旗| 隆林| 龙胜| 神农架林区| 枣阳市| 宿松县| 中超| 新兴县| 青冈县| 镇原县| 东乌珠穆沁旗| 华阴市| 苏州市| 白朗县| 巨野县| 新晃| 夹江县| 鞍山市| 濮阳县| 镇巴县| 托克托县| 江油市| 青铜峡市| 双峰县| 宕昌县| 扎兰屯市| 蕲春县| 泸定县| 湘西|