- HashMap 不是線程安全的崇裁。
- HashMap 做 put 操作時,兩個線程同時進(jìn)入 addEntry 操作束昵,計算出相同的 hash 值拔稳,A線程寫入頭節(jié)點之后,B線程也寫入頭節(jié)點妻怎,那么A的操作就會被覆蓋壳炎,造成A的寫入操作丟失泞歉。
- Vector 和 HashTable逼侦,concurrentHashMap,copyOnwriteArrayList時線程安全的腰耙。
- 繼承不同榛丢。HashMap 是繼承自 AbstractMap 類,而 HashTable 是繼承自 Dictionary 類挺庞。
- HashTable 中的方法是同步的晰赞,HashMap 是非同步的。HashTable 的實現(xiàn)方法里面都添加了 synchronized 關(guān)鍵字來確保同步选侨,使用HashMap的話就要自己增加同步處理掖鱼。同步方法 Map m = Collections.synchronizeMap(hashMap);
- HashTable 中,K援制,V都不允許出現(xiàn)null戏挡;HashMap中,null 可以作為鍵晨仑,這樣的鍵只有一個褐墅,為 null 的值可以有一個或多個。(HashMap中不能用get()來判斷是否存在某個鍵洪己,應(yīng)該用containsKey() )
- 遍歷方式妥凳。HashMap、HashTable 都使用了 Iterator 答捕。由于歷史原因 HashTable 還使用了 Enumeration 的方式逝钥。Iterator 的迭代器是 fail-fast 迭代器,而 Enumeration 不是拱镐。
- hash值的使用不同艘款。HashTable 直接使用對象的 Hashcode,HashMap 重新計算 hash值痢站。
- 數(shù)組的初始大小和擴(kuò)容方式不同磷箕。HashTable 的數(shù)組默認(rèn)大小是11,擴(kuò)容方式是 old * 2 + 1阵难。HashMap 中數(shù)組默認(rèn)大小是16岳枷,擴(kuò)容方式是 2 的指數(shù)次冪。
- 求數(shù)組下標(biāo)方式不同。hashTable 通過除以 length 取余空繁,hashMap是與 length - 1 進(jìn)行按位與運(yùn)算殿衰。