標籤:之一 節點 情境 src 介面 最佳化 處理 cti 鏈表
轉載請註明源出處: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