hashmap底層實(shí)現(xiàn)原理
2023-06-07 17:26:10 閱讀(191)
redis hashmap原理?
Redis HashMap原理是把HashMap中的每個(gè)鍵值對(duì)用一個(gè)字符串來表示。既然每個(gè)鍵值對(duì)都用一個(gè)字符串表示,我們就可以使用Redis的HSET/HGET/HMGET等命令來控制它們,從而實(shí)現(xiàn)對(duì)hashmap的操作,比如添加/刪除鍵值對(duì)(HSET/HGET);更新值(HDEL/HINCR);查詢值(HMGET/HMGETALL)等等。
hashmap 底層數(shù)據(jù)結(jié)構(gòu)?
HashMap的底層數(shù)據(jù)結(jié)構(gòu)就是哈希表。具體實(shí)現(xiàn)起來就是一維數(shù)組和單向鏈表,一個(gè)HashMap對(duì)象就是一個(gè)一維數(shù)組和幾條單向鏈表,數(shù)組中的元素就是單向鏈表的起始節(jié)點(diǎn)。 往HashMap中存數(shù)據(jù)時(shí):根據(jù)key和value構(gòu)建一個(gè)節(jié)點(diǎn)(一個(gè)Node對(duì)象),而HashMap的數(shù)組的元素就是一個(gè)個(gè)Node對(duì)象, 節(jié)點(diǎn)中存有哈希值、key、value、下一節(jié)點(diǎn)的內(nèi)存地址,此時(shí)下一節(jié)點(diǎn)的內(nèi)存地址還是null,哈希值是key調(diào)用hashCode方法產(chǎn)生的。
hashmap源碼原理?
HashMap實(shí)現(xiàn)原理:由數(shù)組+鏈表組成的,數(shù)組是HashMap的主體,在每個(gè)數(shù)組元素上都一個(gè)鏈表結(jié)構(gòu),當(dāng)數(shù)據(jù)被Hash后,得到數(shù)組下標(biāo),把數(shù)據(jù)放在對(duì)應(yīng)下標(biāo)元素的鏈表上。 鏈表則是主要為了解決哈希沖突而存在的,如果定位到的數(shù)組位置不含鏈表,那么對(duì)于查找,添加等操作很快,僅需一次尋址即可;如果定位到的數(shù)組包含鏈表,對(duì)于添加操作,其時(shí)間復(fù)雜度依然為O(1),因?yàn)樽钚碌腅ntry會(huì)插入鏈表頭部,急需要簡單改變引用鏈即可,而對(duì)于查找操作來講,此時(shí)就需要遍歷鏈表,然后通過key對(duì)象的equals方法逐一比對(duì)查找。所以,性能考慮,HashMap中的鏈表出現(xiàn)越少,性能才會(huì)越好。
currenthashmap實(shí)現(xiàn)原理?
currenthashmap主要是數(shù)組+segment+分段鎖,將數(shù)據(jù)分成段,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線程訪問,能夠?qū)崿F(xiàn)真正的并發(fā)訪問。ConcurrentHashMap定位一個(gè)元素的過程需要進(jìn)行兩次Hash操作。 第一次Hash定位到Segment,第二次Hash定位到元素所在的鏈表的頭部;
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ù)量)及其大?。ㄦI-值映射關(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ù)。
未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處