HashMap和Hashtable 區別
阿新 • • 發佈:2019-08-21
- Hashtable是執行緒安全,而HashMap則非執行緒安全
- Hashtable的實現方法裡面都添加了synchronized關鍵字來確保執行緒同步
- HashMap可以使用null作為key,而Hashtable則不允許null作為key
- HashMap是對Map介面的實現,HashTable實現了Map介面和Dictionary抽象類
- HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子預設都是0.75
- HashMap擴容時是當前容量翻倍即:capacity*2,
- Hashtable擴容時是容量翻倍+1即:capacity*2+1
- 兩者計算hash的方法不同
- Hashtable計算hash是直接使用key的hashcode對table陣列的長度直接進行取模
-
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;
-
- HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的雜湊值,然後對table陣列長度取摸
-
static int hash(int h) { // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } static int indexFor(int h, int length) { return h & (length-1); }
-
- HashMap和Hashtable的底層實現都是陣列+連結串列結構實現
- Hashtable計算hash是直接使用key的hashcode對table陣列的長度直接進行取模