HashMap是線程安全的嗎?爲何?那些是線程安全的容器?以及HashMap與HashTable的區別?
- HashMap 不是線程安全的。
- HashMap 作 put 操做時,兩個線程同時進入 addEntry 操做,計算出相同的 hash 值,A線程寫入頭節點以後,B線程也寫入頭節點,那麼A的操做就會被覆蓋,形成A的寫入操做丟失。
- Vector 和 HashTable,concurrentHashMap,copyOnwriteArrayList時線程安全的。
- 繼承不一樣。HashMap 是繼承自 AbstractMap 類,而 HashTable 是繼承自 Dictionary 類。
- HashTable 中的方法是同步的,HashMap 是非同步的。HashTable 的實現方法裏面都添加了 synchronized 關鍵字來確保同步,使用HashMap的話就要本身增長同步處理。同步方法 Map m = Collections.synchronizeMap(hashMap);
- HashTable 中,K,V都不容許出現null;HashMap中,null 能夠做爲鍵,這樣的鍵只有一個,爲 null 的值能夠有一個或多個。(HashMap中不能用get()來判斷是否存在某個鍵,應該用containsKey() )
- 遍歷方式。HashMap、HashTable 都使用了 Iterator 。因爲歷史緣由 HashTable 還使用了 Enumeration 的方式。Iterator 的迭代器是 fail-fast 迭代器,而 Enumeration 不是。
- hash值的使用不一樣。HashTable 直接使用對象的 Hashcode,HashMap 從新計算 hash值。
- 數組的初始大小和擴容方式不一樣。HashTable 的數組默認大小是11,擴容方式是 old * 2 + 1。HashMap 中數組默認大小是16,擴容方式是 2 的指數次冪。
- 求數組下標方式不一樣。hashTable 經過除以 length 取餘,hashMap是與 length - 1 進行按位與運算。
歡迎關注本站公眾號,獲取更多信息