HashMap是線程安全的嗎?爲何?那些是線程安全的容器?以及HashMap與HashTable的區別?

  • HashMap 不是線程安全的。
  • HashMap 作 put 操做時,兩個線程同時進入 addEntry 操做,計算出相同的 hash 值,A線程寫入頭節點以後,B線程也寫入頭節點,那麼A的操做就會被覆蓋,形成A的寫入操做丟失。
  • Vector 和 HashTable,concurrentHashMap,copyOnwriteArrayList時線程安全的。

  1. 繼承不一樣。HashMap 是繼承自 AbstractMap 類,而 HashTable 是繼承自 Dictionary 類。
  2. HashTable 中的方法是同步的,HashMap 是非同步的。HashTable 的實現方法裏面都添加了 synchronized 關鍵字來確保同步,使用HashMap的話就要本身增長同步處理。同步方法 Map m = Collections.synchronizeMap(hashMap);
  3. HashTable 中,K,V都不容許出現null;HashMap中,null 能夠做爲鍵,這樣的鍵只有一個,爲 null 的值能夠有一個或多個。(HashMap中不能用get()來判斷是否存在某個鍵,應該用containsKey() )
  4. 遍歷方式。HashMap、HashTable 都使用了 Iterator 。因爲歷史緣由 HashTable 還使用了 Enumeration 的方式。Iterator 的迭代器是 fail-fast 迭代器,而 Enumeration 不是。
  5. hash值的使用不一樣。HashTable 直接使用對象的 Hashcode,HashMap 從新計算 hash值。
  6. 數組的初始大小和擴容方式不一樣。HashTable 的數組默認大小是11,擴容方式是 old * 2 + 1。HashMap 中數組默認大小是16,擴容方式是 2 的指數次冪。
  7. 求數組下標方式不一樣。hashTable 經過除以 length 取餘,hashMap是與 length - 1 進行按位與運算。
相關文章
相關標籤/搜索