Java雜湊表
阿新 • • 發佈:2020-11-28
先引入雜湊函式的概念:是對輸入的某個key作為hash函式的輸入 得到某個數字,將該數字作為陣列的下標,將輸入的值作為value進行儲存。
但是有可能hash得到的值(hashcode)衝突,也就是所謂的雜湊衝突,這時候就有幾種處理方式,比如再雜湊,開放地址法,鏈地址法等等,在雜湊表中採用的就是鏈地址法(陣列+連結串列)。
雜湊表
雜湊表的主體是一個數組,陣列的長度便代表了桶的個數,桶中存放的都是雜湊值一致的Entry。雜湊表的基本元素是Entry<key,value>.裡面儲存的是最重要的資訊是鍵值對。
Entry是雜湊表的一個內部類,程式碼如下
static class Entry<K,V> implementsMap.Entry<K,V> { final K key; V value; Entry<K,V> next;//儲存指向下一個Entry的引用,單鏈表結構 int hash;//對key的hashcode值進行hash運算後得到的值,儲存在Entry,避免重複計算 /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next= n; key = k; hash = h; }
連結串列是用來對產生雜湊衝突的鍵進行處理的,理論上來說連結串列越少越好,因為對連結串列的查詢時間複雜度為O(n),若沒有雜湊衝突時間複雜度為O(1)。
一些其他引數:
裝填因子:表示當被填充的桶的個數與總桶數的閾值。當被填充的桶數大於這個值時,雜湊表會進行resize,將自身的長度乘以2.
為什麼雜湊表的長度一般為2的冪次方
先了解一下得到陣列索引的步驟
1.根據將key進行hash() 得到hashcode
2.hashcode&(length-1)得到陣列索引
公式:當 length為2的冪次方時,hashcode&(length-1) = hashcode%length(通過這種方式能比較均勻地將hashcode進行分佈)
而&的效率大於%,所以用將長度設為2^n比較好