hashing(雜湊法)的概念
雜湊法(hashing)是一種將字元組成的字串轉換為固定長度(一般是更短長度)的數值或索引值的方法,稱為雜湊法,也叫雜湊法。由於通過更短的雜湊值比用原始值進行資料庫搜尋更快,這種方法一般用來在資料庫中建立索引並進行搜尋,同時還用在各種解密演算法中。
hashmap概念和底層結構
hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。hashmap儲存的是鍵值對,hashmap很快。此類不保證對映的順序,特別是它不保證該順序恆久不變。
hashmap 內部結構:可以看作是陣列和鍊錶結合組成的復合結構,陣列被分為乙個個桶,每個桶儲存有乙個或多個物件(鍵值對),每個物件(鍵值對)包含三部分key(鍵)、value(值),next(指向下乙個物件),通過雜湊值決定了物件(鍵值對)在這個陣列的定址;雜湊值相同的物件(鍵值對),則以鍊錶形式儲存。如果鍊錶大小超過樹形轉換的閾值(treeify_threshold= 8),鍊錶就會被改造為樹形結構(紅黑樹)。
hashmap的內部結構示意圖如下:
查詢時間複雜度:hashmap的本質可以認為是乙個陣列,陣列的每個索引被稱為桶,每個桶裡放著乙個單鏈表,乙個節點連著乙個節點。很明顯通過下標來檢索陣列元素時間複雜度為快,而且遍歷鍊錶的時間複雜度是慢。
陣列:儲存區間連續,占用記憶體嚴重,尋找容易,插入刪除困難;
鍊錶:儲存區間離散,占用記憶體比較寬鬆,尋找困難,插入刪除容易;
hashmap綜合應用了這兩種資料結構,實現了尋找容易,插入刪除也容易。
hashmap如何重新調整容量的大小
hashmap的擴容閾值(threshold(擴容閾值) = capacity(容量) * loadfactor(負載因子) ),就是通過它和size進行比較來判斷是否需要擴容。預設的負載因子大小為0.75,也就是說,當乙個map填滿了75%的桶時候,和其它集合類(如arraylist等)一樣,將會建立原來hashmap大小的(capacity(容量) * loadfactor(負載因子)) 的桶陣列,來重新調整map的大小,並將原來的物件放入新的桶陣列中。這個過程叫作rehashing(重雜湊),因為它呼叫hash方法找到新的桶位置。
解決 hash 衝突的常見方法
針對雜湊表直接定址可能存在hash衝突,舉乙個簡單的例子,例如:
第乙個鍵值對a進來,通過計算其key的hash得到的index=0。記做:桶[0] = a。
第二個鍵值對b,通過計算其index也等於0, hashmap會將b.next =a,桶[0] =b,
第三個鍵值對c,通過計算其index也等於0,那麼c.next = b,桶[0] = c;
這樣我們發現index=0的地方事實上訪問了a,b,c三個鍵值對,它們通過next這個屬性鏈結在一起。 對於不同的元素,可能計算出了相同的函式值,這樣就產生了hash 衝突,那要解決衝突,又有哪些方法呢?具體如下:
c. 再雜湊法:即發生衝突時,由其他的函式再計算一次雜湊值。
d. 建立公共溢位區:將雜湊表分為基本表和溢位表,發生衝突時,將衝突的元素放入溢位表。
hashmap採用哪種方法解決衝突的呢?
hashmap 就是使用鏈位址法來解決衝突的(jdk8中採用平衡樹來替代鍊錶儲存衝突的元素,但hash() 方法原理相同)。當兩個物件的hashcode相同時,它們的桶位置相同,碰撞就會發生。
深入理解hashmap的原理
一 什麼是雜湊?雜湊也叫雜湊,是將不同長度的輸入通過乙個函式轉換成同乙個長度輸出的過程,這個輸出的值叫雜湊值,這個轉換函式叫雜湊函式,雜湊函式所採用的演算法加雜湊演算法。實際上是乙個通過訊息得到訊息摘要的方法 二 什麼是雜湊表?雜湊表是乙個通過key訪問value的資料結構,它是基於乙個陣列,存資料...
HashMap深入理解
hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。hashmap儲存的是鍵值對,hashmap很快。此類不保證對映的順序,特別是它不保證該順序恆久不變。此實現假定雜湊函式將元素適當地分布在各桶之間,可以為基本操作 get和put 提供...
深入理解windows內部原理系列 筆記二
cr3暫存器 用來記錄頁目錄表的物理基位址的暫存器,簡稱pdbr page directory base register 切換cr3暫存器意味著切換位址空間 不同程序擁有不同的位址空間 cr3內容 隔離的保護 執行緒 cpu的排程單位 任務任務狀態段 task state segment 程序 執...