1. 程式人生 > >Java之集合(十四)Hashtable

Java之集合(十四)Hashtable

實現類 mage 進行 取代 結構 con light hold 安全

  轉載請註明源出處:http://www.cnblogs.com/lighten/p/7426522.html

1.前言

  HashTable這個類很奇特,其繼承了Dictionary這個沒有任何具體實現類,而後實現了Map接口。Dictionary對大部分人而言都十分陌生,因為這個類並沒有什麽用,其出現在JDK1.0,而Map接口最早出現在JDK1.2。這個應該是JDK自己的類體系進行了調整,使得Dictionary類沒有什麽價值。在HashMap中我就提到過HashTable,這兩個類最大的區別就是HashTable是線程安全的,且HashTable不允許空的鍵值。實際上現在使用HashTable的可能性比較低了,其表現不如HashMap,線程安全也可以選擇性能更高的ConcurrentHashMap。不過還是對其進行簡單的介紹,實現也是比HashMap簡單多了。

2.Hashtable

技術分享

  Hashtable擁有和HashMap相似的結構,這裏不進行過多描述。threshold就是表需要擴容的閾值,loadFactor就是用來計算這個閾值的載入因子,其乘上表的大小就是閾值了。一般為0.75f,意味著hash表的3/4有數據就進行擴容。

技術分享

  上面是一般的構造函數,默認大小11,載入因子0.75f。

技術分享

  get方法就可以看出,其對null沒有進行處理。插入hash表也是一般的方法,計算hash值,先做與操作保證hash值為正數,再取余保證落在hash表上。之後就是hash桶的鏈表遍歷了,找到對應的值。

技術分享

  put方法限制了存入空值。插入也是一樣的,先計算出落在hash表上的位置,再查找其原來存在與否,存在就替換舊值,返回。不存在就添加。

技術分享

  添加的過程先判斷是否達到擴容的閾值,到了就擴容。重新計算鍵的hash值和在hash表上的位置。之後就將其放在鏈表表頭。這個過程和WeakHashMap是類似的。

技術分享

  remove方法一樣,找到Hash表上的位置,遍歷找到該值,將前面的節點和後面的節點連起來就可以了。

  其它的方法不進行介紹了,較為簡單。

3.後記

  HashTable是最早的類之一,目前使用的場景不大,鍵值不為null可以自己判斷,至於線程安全也可以被Collections.synchronizedMap(HashMap)或者效率更高的ConcurrentHashMap取代。所以該類不推薦使用,畢竟HashMap和ConcurrentHashMap進行了大量的優化。

Java之集合(十四)Hashtable