hashmap主要是用來處理鍵值對資料,隨著jdk版本的更新,jdk1.8底層也對hashmap做了一些優化
hashmap是基於雜湊表對map介面的實現類,
他的特點呢是訪問速度快,並且不是按順序來遍歷,
hashmap提供所有的可選的對映操作,但不能保證對映順序不變,
並且允許插入空值和空鍵,
hashmap本身並不是執行緒安全的,
當存在多執行緒同時寫入的時候,可能會導致資料不一致的情況
1.hashmap中的關鍵屬性
loadfactor,他是負載因子,預設值是0.75,,表示在擴容前,hashmap空間填滿程度的邊界
threshold,他是記錄hashmap所能夠容納的鍵值對邊界,他的計算規則 是負載因子*陣列的長度
size,它用來記錄hashmap實際存在的鍵值對的數量,
modcount,它用來記錄hashmap內部結構發生變化的次數,
還有乙個常量屬性default_initial_capacity,它是hashmap的容量值,預設是16
2.hashmap的儲存結構
hashmap採用的是 陣列 + 鍊錶 + 紅黑樹(jdk1.8)+的乙個儲存結構
hashmap的陣列部分稱為hash桶,陣列元素保持在乙個叫做table的屬性中,
當鍊表長度大於8時候,鍊錶的資料將會以紅黑樹的形式儲存,當鍊表長度降到6時候,為鍊錶的形式進行儲存,
每個node節點保證了用來定位陣列的索引位置的hash值和key,value以及鍊錶指向的下乙個node節點,
node類又是hashmap的內部類,它實現了map.entry介面,它的本質其實可以簡單地理解成乙個鍵值對
3.hashmap的工作原理
當我們向hashmap中插入資料時,首先要確定node在陣列中的位置,
利用求模取餘法(h=hashcode%(table.length-1)),就是用hash值和陣列的長度減一,取模,最後得到陣列下標,這樣可以保證陣列下標不越界,只不過位運算是二進位制運算,他的效率更高。
Node單執行緒高併發原理
瀏覽器中的js是單執行緒的,node也是單執行緒的。這個單執行緒相當於乙個大管家,一切大小事務都要經過他的手才能辦成,它總是把io任務放入到任務池中。雖然說是單執行緒,但是node也有乙個執行緒池專門負責執行任務池中的任務,它們把任務完成之後會告知主線程以接下來利用cpu完成處理。關鍵在於理清哪些任...
php 單執行緒
php 從設計之初到流行起來都沒有出現明顯需要用多執行緒才能解決的需求。某些需要用到多執行緒的地方也有相應的解決方案和替代方案。多執行緒並不總是比單執行緒優,多執行緒可能會引入其他問題 例如 兩個執行緒同時呼叫乙個類裡的同乙個方法時,可能出現死鎖的情況 每個 php 檔案的執行是單執行緒的,但是,伺...
Redis單執行緒
redis 的單執行緒主要是指 redis 的網路 io 和鍵值對讀寫是由乙個執行緒來完成的,這也是 redis 對外提供鍵值儲存服務的主要流程。當多個客戶端發起命令,這些命令併發執行時,在redis內部,會排隊逐個執行,也就是執行命令的那個操作是由乙個執行緒執行的。但 redis 的其他功能,比如...