如果使用排序映射,建議使用TreeMap。使用TreeMap時,鍵必須在構造TreeMap時實現Comparable接口或傳入自定義比較器,否則將在運行時引發java.lang.ClassCastException類型的異常。
Hashtable是壹個遺留類,很多映射的常用函數和HashMap類似,只是繼承了Dictionary類,線程安全,任何時候只有壹個線程可以寫Hashtable。
在結構實現上,HashMap的實現方式是:數組+鏈表+紅黑樹(JDK1.8加紅黑樹)。
擴展數據
從源代碼中可以看到,HashMap類中有壹個非常重要的字段,就是Node[]表,也就是hash bucket數組。Node是HashMap的內部類,它實現了映射。進入界面。本質上是壹個映射(鍵值對),除了K和v,還包括hash和next。
HashMap是使用哈希表存儲的。為了解決沖突,哈希表采用了鏈地址的方法來解決問題。簡而言之,鏈地址法是數組和鏈表的結合。每個數組元素上都有壹個鏈表結構。當數據被散列時,獲得數組下標,並將數據放在相應下標元素的鏈表中。
如果哈希桶數組很大,即使是再差的哈希算法也會很散。如果哈希桶數組數組很小,再好的哈希算法也會有更多的碰撞,所以需要權衡空間成本和時間成本。其實就是根據實際情況確定哈希桶數組的大小,並在此基礎上設計好哈希算法,減少哈希碰撞。