Java集合框架(Collection Framework)學習之 HashMap

API文檔能夠獲得HashMap的如下幾個特色:

  • 基於哈希表(hash table)實現,而且是鏈式哈希表
  • 容許空值和空鍵(null=null 鍵值對)
  • HashMap與Hashtable基本相同,區別是HashMap是非同步、非線程安全的,而且能夠支持空值
  • HashMap是無序的:HashMap不保證元素的順序,也不保證元素的順序會保持不變
  • O(1)的時間效率:它對get和put基本操做提供了常數時間(constant-time)的性能
  • 影響HashMap性能的兩個參數:初始化容量和負載因子(load factor)。不要把初始化容量設的太大,也不要把負載因子設的過小 。爲了更好地權衡時間和空間消耗,默認的負載因子通常爲0.75。默認的容量是16。
  • 當哈希表裏的entry(鍵值對)超過必定閾值(threshold=capacity*factor)時,哈希表會進行再哈希(rehash)。再哈希後的哈希表的桶的個數以前的兩倍 。

使用選擇

Hashtable 從jdk1.0就有了,而HashMap是jdk1.2添加了,ConcurrentHashMap在jdk1.5才提供。
Hashtable和ConcurrentHashMap都是線程安全的。可是ConcurrentHashMap是1.5添加的更高級的併發工具。它使用了分段鎖技術來實現更細粒度的同步。所以ConcurrentHashMap比Hashtable效率較高,所以在多線程狀況下通常使用ConcurrentHashMap。而HashMap是非線程安全的,所以通常在單線程下使用。html

優先選擇:多線程訪問:ConcurrentHashMap。單線程訪問:HashMapjava

驗證

寫個簡單易懂的代碼做爲例子,代碼以下,而後分別在有註釋的兩行代碼前設置斷點:api

public class HashMapL {

    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(null, null);  //test null key and null value;
        for(int i=0; i<16; i++){
            hashMap.put(i, i);  //autoboxing
        }
                
}

以debug模式運行上面代碼能夠看出HashMap<Integer, Integer> hashMap = new HashMap<>();初始化了以下的hashMap:
數組

從上圖能夠看到,負載因子loadfactor默認值是0.75。注意,threshold如今的值時0。根據HashMap源碼裏面的註釋能夠知道,這個值是在給table分配空間後纔會計算threshold的值,分配前它的值是0,而如今table的值爲null,還沒有分配。那麼這裏的table是什麼呢?瞭解拉鍊式哈希表的人就會輕易知道它是一個鏈表數組。安全

按F6執行下一步,給hashMap賦值,而且是空值,來驗證與Hashtable的區別:能夠保存空值。
多線程

從上圖能夠看到,併發

  1. 如今table已經初始化了,它如今擁有一個元素 "null=null"(從圖片最下面能夠當作)。
  2. 它是一個包含16個元素的Node<k,v>類型數組
  3. 記住,如今table的id=24,能夠和以後進行再哈希後的tableid對比。

繼續按F6,直到size=threshold=12,此刻table的id和以前的同樣,仍是id=24
oracle

如今再按一次F6執行下一步,向hashMap裏添加一個元素,讓元素的總數size大於閾值threshold
工具

從圖片中看到,table的id=104,大小爲32,閾值threshold=24。而以前的id=24,大小爲16,threshold=12。所以得出結論,性能

當元素大小size大於閾值threshold時就會進行再哈希。再哈希後,HashMap就會自動擴容爲以前的2倍。而且用一個新的對象代替原來的對象。
由此也可得知,自動擴容是須要消耗資源的,要儘可能減小自動擴容的發生。

參考:

API文檔
How HashMap works in java,強烈推薦! (以前看了這篇文章感受真的太好了,有種本身不用寫了感受。因此這篇博文最主要的目的是總結下HashMap的特色。和這篇文章的debug思路)

相關文章
相關標籤/搜索