原始碼剖析 Hashtable 原始碼剖析

2021-10-14 17:41:57 字數 1834 閱讀 3244

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key-value對,其內部也是通過單鏈表解決衝突問題,容量不足(超過了閾值)時,同樣會自動增長。

hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。

hashtable同樣實現了serializable介面,它支援序列化,實現了cloneable介面,能被轉殖。

hashtable的原始碼的很多實現都和hashmap差不多,原始碼如下(加入了比較詳細的注釋):

針對hashtable,我們同樣給出幾點比較重要的總結,但要結合與hashmap的比較來總結。

二者的儲存結構和解決衝突的方法都是相同的。

hashtable在不指定容量的情況下的預設容量為11,而hashmap為16,hashtable不要求底層陣列的容量一定要為2的整數次冪,而hashmap則要求一定為2的整數次冪。

hashtable中key和value都不允許為null,而hashmap中key和value都允許為null(key只能有乙個為null,而value則可以有多個為null)。但是如果在hashtable中有類似put(null,null)的操作,編譯同樣可以通過,因為key和value都是object型別,但執行時會丟擲nullpointerexception異常,這是jdk的規範規定的。我們來看下containskey方法和containsvalue的原始碼:

// 判斷hashtable是否包含「值(value)」    

public synchronized boolean contains(object value)     

// 從後向前遍歷table陣列中的元素(entry)    

// 對於每個entry(單向鍊錶),逐個遍歷,判斷節點的值是否等於value    

entry tab = table;    

for (int i = tab.length ; i-- > 0 ;)     

}    

}    return false;    

}    

public boolean containsvalue(object value)     

// 判斷hashtable是否包含key    

public synchronized boolean containskey(object key)     

}    return false;    

}

很明顯,如果value為null,會直接丟擲nullpointerexception異常,但原始碼中並沒有對key是否為null判斷,有點小不解!不過nullpointerexception屬於runtimeexception異常,是可以由jvm自動丟擲的,也許對key的值在jvm中有所限制吧。4. hashtable擴容時,將容量變為原來的2倍加1,而hashmap擴容時,將容量變為原來的2倍。5. hashtable和hashmap都重新計算了key的hash值,hashtable在求hash值對應的位置索引時,用取模運算,而hashmap在求位置索引時,則用與運算,且這裡一般先用hash&0x7fffffff後,再對length取模,&0x7fffffff的目的是為了將負的hash值轉化為正值,因為hash值有可能為負數,而&0x7fffffff後,只有符號外改變,而後面的位都不變。

《STL原始碼剖析》之hashtable

hashtable即雜湊表,也叫雜湊表,它對元素的插入 刪除和訪問操作具有常數時間複雜度的表現,這種表現不依賴於輸入元素的隨機性。假如使用雜湊儲存資料,且該所有的資料是16 bits且不帶正負號,範圍是0 65535,那麼使用乙個array就可以滿足上述期望。具體操作 上述操作時間複雜度均為常數時間...

重讀STL原始碼剖析 hashtable

hashtable的設計是乙個vector陣列,每個陣列內為乙個鍊錶,煉錶鏈著hash到同位置的節點,但鍊錶的實現不是list或slist hashtable的節點設計 1.儲存元素值的變數val 2.乙個指向下乙個節點 同乙個bucket內的 的指標next hashtable的迭代器 1.內部維...

malloc的原始碼剖析源

對malloc的原始碼剖析源於我自己實現的共享記憶體分配器,使用buddy演算法和紅黑樹結構實現對共享記憶體的分配 管理,對其效能進行測試的時候,發現效能只有malloc的1 3 1 2,原本以為自己的實現效能應該比malloc高的,結果出乎意外,這讓我產生窺探dlmalloc原始碼的好奇心,為此,...