hashmap原理面試 HashMap的內(nèi)部實(shí)現(xiàn)機(jī)制,Hash是怎樣實(shí)現(xiàn)的,什么時(shí)候ReHash?
HashMap的內(nèi)部實(shí)現(xiàn)機(jī)制,Hash是怎樣實(shí)現(xiàn)的,什么時(shí)候ReHash?此實(shí)現(xiàn)假定哈希函數(shù)將元素適當(dāng)?shù)胤植荚诟魍爸g,可為基本操作(get 和 put)提供穩(wěn)定的性能。迭代 collection 視
HashMap的內(nèi)部實(shí)現(xiàn)機(jī)制,Hash是怎樣實(shí)現(xiàn)的,什么時(shí)候ReHash?
此實(shí)現(xiàn)假定哈希函數(shù)將元素適當(dāng)?shù)胤植荚诟魍爸g,可為基本操作(get 和 put)提供穩(wěn)定的性能。迭代 collection 視圖所需的時(shí)間與 HashMap 實(shí)例的“容量”(桶的數(shù)量)及其大小(鍵-值映射關(guān)系數(shù))成比例。所以,如果迭代性能很重要,則不要將初始容量設(shè)置得太高(或?qū)⒓虞d因子設(shè)置得太低)。
HashMap 的實(shí)例有兩個(gè)參數(shù)影響其性能:初始容量 和加載因子。容量 是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時(shí)的容量。加載因子 是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對(duì)該哈希表進(jìn)行 rehash 操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。
LinkdHashSet底層怎么實(shí)現(xiàn)元素有序?
1.LinkedHashSet是繼承HahsSet的,構(gòu)造方法調(diào)用HashSet有三個(gè)參數(shù)的方法,這個(gè)構(gòu)造方法底層會(huì)初始化化一個(gè)LinkedHashMap。因?yàn)長(zhǎng)inkedHashMap是有序的,所以LinkedHashSet也是有序的。為什么這個(gè)構(gòu)造方法我們不能調(diào)用,因?yàn)槭前L問(wèn)級(jí)別的,外部無(wú)法調(diào)用。接下來(lái)分析下LinkedHashMap是怎么實(shí)現(xiàn)的就明白為什么有序了。
2.可以先看下下面的圖片。(手機(jī)上寫的問(wèn)題,不能把圖片放在正文里,全部在最下面)。
LinkedHashMap的數(shù)據(jù)結(jié)構(gòu)和HashMap就是Entry不一樣,HashMap中的Entry有四個(gè)屬性key,value,hash,next,而LinkedHashMap中的Entry添加了before和after屬性,所以說(shuō)LinkedHashMap是在HashMap的基礎(chǔ)上使用了雙向鏈表把所有節(jié)點(diǎn)連起來(lái),當(dāng)然還有一個(gè)頭節(jié)點(diǎn),所以遍歷的時(shí)候可以保證有序。具體結(jié)構(gòu)可以看圖。
3.LinkedHashMap主要是重寫了addEntry,createEntry方法來(lái)達(dá)到在創(chuàng)建節(jié)點(diǎn)的時(shí)候創(chuàng)建雙向鏈表。
另外,LinkedHashMap還可以實(shí)現(xiàn)LRU算法的緩存。
源碼是基于JDK7看的哈。如果不理解HashMap可以看我分享的另一篇文章。
希望對(duì)你有幫助,可以關(guān)注我,后續(xù)會(huì)分享更多的架構(gòu)和Java知識(shí)文章。