hashmap底層實現(xiàn)原理
2023-06-07 17:26:10 閱讀(191)
redis hashmap原理?
Redis HashMap原理是把HashMap中的每個鍵值對用一個字符串來表示。既然每個鍵值對都用一個字符串表示,我們就可以使用Redis的HSET/HGET/HMGET等命令來控制它們,從而實現(xiàn)對hashmap的操作,比如添加/刪除鍵值對(HSET/HGET);更新值(HDEL/HINCR);查詢值(HMGET/HMGETALL)等等。
hashmap 底層數(shù)據(jù)結構?
HashMap的底層數(shù)據(jù)結構就是哈希表。具體實現(xiàn)起來就是一維數(shù)組和單向鏈表,一個HashMap對象就是一個一維數(shù)組和幾條單向鏈表,數(shù)組中的元素就是單向鏈表的起始節(jié)點。 往HashMap中存數(shù)據(jù)時:根據(jù)key和value構建一個節(jié)點(一個Node對象),而HashMap的數(shù)組的元素就是一個個Node對象, 節(jié)點中存有哈希值、key、value、下一節(jié)點的內存地址,此時下一節(jié)點的內存地址還是null,哈希值是key調用hashCode方法產生的。
hashmap源碼原理?
HashMap實現(xiàn)原理:由數(shù)組+鏈表組成的,數(shù)組是HashMap的主體,在每個數(shù)組元素上都一個鏈表結構,當數(shù)據(jù)被Hash后,得到數(shù)組下標,把數(shù)據(jù)放在對應下標元素的鏈表上。 鏈表則是主要為了解決哈希沖突而存在的,如果定位到的數(shù)組位置不含鏈表,那么對于查找,添加等操作很快,僅需一次尋址即可;如果定位到的數(shù)組包含鏈表,對于添加操作,其時間復雜度依然為O(1),因為最新的Entry會插入鏈表頭部,急需要簡單改變引用鏈即可,而對于查找操作來講,此時就需要遍歷鏈表,然后通過key對象的equals方法逐一比對查找。所以,性能考慮,HashMap中的鏈表出現(xiàn)越少,性能才會越好。
currenthashmap實現(xiàn)原理?
currenthashmap主要是數(shù)組+segment+分段鎖,將數(shù)據(jù)分成段,然后給每一段數(shù)據(jù)配一把鎖,當一個線程占用鎖訪問其中一個段數(shù)據(jù)的時候,其他段的數(shù)據(jù)也能被其他線程訪問,能夠實現(xiàn)真正的并發(fā)訪問。ConcurrentHashMap定位一個元素的過程需要進行兩次Hash操作。 第一次Hash定位到Segment,第二次Hash定位到元素所在的鏈表的頭部;
HashMap的內部實現(xiàn)機制,Hash是怎樣實現(xiàn)的,什么時候ReHash?
此實現(xiàn)假定哈希函數(shù)將元素適當?shù)胤植荚诟魍爸g,可為基本操作(get 和 put)提供穩(wěn)定的性能。迭代 collection 視圖所需的時間與 HashMap 實例的“容量”(桶的數(shù)量)及其大?。ㄦI-值映射關系數(shù))成比例。所以,如果迭代性能很重要,則不要將初始容量設置得太高(或將加載因子設置得太低)。 HashMap 的實例有兩個參數(shù)影響其性能:初始容量 和加載因子。容量 是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數(shù)超出了加載因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數(shù)據(jù)結構),從而哈希表將具有大約兩倍的桶數(shù)。
未經(jīng)允許不得轉載,或轉載時需注明出處