1. 程式人生 > >HashMap的底層實現原理、HashMap與HashTable的區別、HashMap與HashSet的區別

HashMap的底層實現原理、HashMap與HashTable的區別、HashMap與HashSet的區別

一、HashMap的工作原理:    

      HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取物件。當我們將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。HashMap使用連結串列來解決碰撞問題,當發生碰撞了,物件將會儲存在連結串列的下一個節點中。 HashMap在每個連結串列節點中儲存鍵值對物件。

當兩個不同的鍵物件的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的連結串列中。鍵物件的equals()方法用來找到鍵值對。

二、HashMap與HashTable的區別

    HashMap和Hashtable都實現了Map介面,主要的區別有:執行緒安全性,同步(synchronization),以及速度。
  1. HashMap是非synchronized的,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是執行緒安全的,多個執行緒可以共享一個Hashtable;而如果沒有正確的同步的話,多個執行緒是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充套件性更好。
  3. 另一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會丟擲ConcurrentModificationException異常。
  4. 由於Hashtable是執行緒安全的也是synchronized,所以在單執行緒環境下它比HashMap要慢。如果你不需要同步,只需要單一執行緒,那麼使用HashMap效能要好過Hashtable。
  5. HashMap不能保證隨著時間的推移Map中的元素次序是不變的。

實現HashMap同步:

Map m = Collections.synchronizeMap(hashMap);

三、HashMap與HashSet的區別

HashMapHashSet
HashMap實現了Map介面HashSet實現了Set介面
HashMap儲存鍵值對HashSet僅僅儲存物件
使用put()方法將元素放入map中使用add()方法將元素放入set中
HashMap中使用鍵物件來計算hashcode值HashSet使用成員物件來計算hashcode值,對於兩個物件來說hashcode可能相同,所以equals()方法用來判斷物件的相等性,如果兩個物件不同的話,那麼返回false
HashMap比較快,因為是使用唯一的鍵來獲取物件HashSet較HashMap來說比較慢
參考:https://www.cnblogs.com/beatIteWeNerverGiveUp/p/5709841.html