Map底層原理解析

2021-09-10 02:25:54 字數 1341 閱讀 6020

map

採用了陣列加鍊表的方式儲存(橫向陣列,縱向鍊錶),當有同一hash值得資料會被房到同意陣列後面形成鍊錶

hashmap(預設16長度)

put

int hash =

hash

(key)

; 獲取hash值

int i =

indexfor

(hash, table.length)

; tab[hash&

(n-1

)]返回map table索引位置(為了解決均勻雜湊索引)

迴圈遍歷鍊錶,如果當前entry hash值與key跟傳入的key相等則將新值賦值給舊值,返回舊值

否則建立新的entry,並將空的tab[hash&

(n-1

)]賦值給entry.next

get

<1>

計算hash值

<2>

遍歷鍊錶,根據int i =

indexfor

(hash, table.length)

;map table陣列索引值位置

hashtable(預設11長度)

hashtable使用了synchronized進行加鎖

int hash = hash(key);獲取該key的雜湊值

int index = (hash & 0x7fffffff) % tab.length; 獲取該key在table陣列的索引下標,得到該索引下的鍊錶

concurrenthashmap(預設16長度的segment(段),16個併發)

初始化:預設初始化16段(segment),16個併發數,在第一段初始化長度為2的hashentry陣列(主要作用是儲存第一次初始化的時候的引數如:長度,擴充套件閾值)

在操作put與get的時候使用了unsafe非阻塞同步機制(基於硬體級別的cas演算法),segment操作時會經過兩次hash運算,

第一次hash:(hash(key) >>> segmentshift(28)) & segmentmask(15)得到segment的位置

第二次hash是用第一次hash值的基礎上(tab.length - 1) & hash得到hashentry陣列的索引,從而得到鍊錶

concurrenthashmap結構為先分為16個segment段,在每個segment再已橫向hashentry陣列,再縱向鍊錶的形式儲存資料,

操作是採用reentrantlock鎖住乙個segment裡面hashentry,保證執行緒安全而不會鎖住整個map

put操作

先獲取key的hash值計算該key在segment位置

Redis主從配置和底層實現原理解析 實戰記錄

我們使用redis的時候往往都是主從模式或者集群架構,不會使用單台redis服務。我們使用master節點寫輸入,然後將資料同步到sl e節點,從節點可以提供讀取或者備份的功能,分擔master節點壓力。redis主從架構搭建,配置從節點步驟 1 複製乙份redis.conf檔案為redis 638...

redis深度理解底層鎖原理

redis的鎖分別有incr setnx set,那麼我們就開始來談談他們的用法和場景吧!1.incr 計時器,1操作 a 語法 incr key b 場景 1 控制api 1秒內的多次訪問 2 記錄使用者每天訪問 的登入次數 c 為何我們說這個怎麼能算鎖呢,當然,單獨它肯定是算不了鎖的,因為它本身...

深入理解springmvc 底層原理

深入理解springmvc 底層原理 web.xml 檔案中的配置 dispatcherservlet springmvc執行流程 springmvc 一切請求的入口 dispatcherservlet 對映處理器 對映 key value 作用 根據請求 url 找到乙個 method handl...