JDK源碼學習之集合HashMap、Hashtable、WeakHashMap比較

先上一張Java 集合框圖:
這裏寫圖片描述

HashMap:

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable 

Hashtable:

public class Hashtable<K,V> extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable

WeakHashMap:

public class WeakHashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V> 

WeakHashMap是一種改進的HashMap,它對key實驗“弱引用”,若是一個key不再被外部所引用,那麼該key可以被GC收受接管。

不同:
1. 繼承不同:
Hashtable繼承自Dictionary
2. 是否允許爲null,是否允許重複
HashMap不允許key重複,允許value重複,只允許一個key爲null,value可以爲任意值,這裏有個需要注意的是,但我們用get()方法返回null值時,即可以表示HashMap中沒有該鍵,也可以表示該鍵所對應的值爲null。。Hashtable的key和value均不允許爲null。
3. 線程安全
HashMap是非synchronized(非線程安全的實現),如果涉及到多個線程,那就不應該考慮使用HashMap。HashMap可以通過下面的語句進行同步: Map map = Collections.synchronizeMap(hashMap) HashTable是synchronized(線程安全實現),這意味着HashTable是線程安全的,多個線程可以共享一個HashTable。但是Java 5提供了ConcurrentHashMap,它比HashTable的擴展性更好、性能更高。ConcurrentHashMap到底和Hashtable有啥不一樣,筆者也查閱下相關知識,主要Hashtable的實現方式是鎖整個hash表,而ConcurrentHashMap分段式封鎖,分層多個節點進行關鍵部位加鎖,避免大鎖,允許多個修改操作併發進行。
4.遍歷方式的內部實現上不同
Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。
5.哈希值的使用不同
HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
6.內部實現方式的數組的初始大小和擴容的方式不一樣
HashTable中的hash數組初始大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章