Class HashMap筆記

    實現接口:Serializable, Cloneable, Map<K,V> 數組

    派生自AbstractMap<K,V> 安全

 

    HashMapHashTable的操做幾乎相同,除了HashMap是非同步的,而且容許nullvaluekey。不保證map的順序固定。 數據結構

    若是hash函數恰當的在桶之間分配元素,能夠實現常數級性能的getput操做。迭代器須要的時間是與hashMap的容量加上key-value映射數目成比例,所以初始化容量不要設得過高或者the load factor too low 函數

    HashMap有兩個影響性能的參數:initial capacityload factorcapacityhash表中桶的數目,load factor是在hash表的capacity自動增加前能填滿到哪一種程度的衡量參數。當哈希表中entry的數目超過load factor設定和當前capacity之積,hash表將從新哈希(內部數據結構會重構),hash表的大小會接近差很少原來的兩倍。 性能

    默認的load factor=0.75。太高的load factor會下降空間開銷,可是會增大大部分HashMap操做的開銷。若是initial capacity比最大數目的entry/load factor還大,則rehash操做不會發生。 spa

    HashMap不是線程安全的,即多個線程同時訪問哈希表,至少有一個對map結構作了修改(包括adddelete一個或多個map映射,不包括對已有keyvalue進行修改),必須在外部進行同步。同步的操做一般經過一些封裝了map的對象來實現。也能夠在建立時用Collections.synchronizedMap 線程

Map m = Collections.synchronizedMap(new HashMap(...)); 指針

    若是map在迭代器以外作告終構性的改動,迭代器會拋出ConcurrentModificationException 對象

    Fail-fast iterator工做在一個獨立的線程中,並擁有一個mutex鎖。Iterator建立後會創建一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,索引當索引指針日後移動時就找不到要迭代的對象,因此fail-fast原則的iterator會立刻拋出上述異常。但當Map中只有一個元素時,這種異常不會被拋出。 索引

 

    initialCapacityloadfactor的默認值分別是160.75。在HashMap的源碼中,定義了

    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    而且註釋說明:Must be a power of two.

    此外,最大Capacity1<<30

    inflateTable(int toSize) 初始化table,本質上新建了一個capacity大小的Entry數組;

 

總結:

1. HashMap是一個Entry數組,數組個數是2x次方,數組每一個單元用描述,每一個桶都有一個對應的Entry鏈,保存了hash到該桶的數據;

2. HashMap有兩個參數,容量和負載因子,分別表示桶的個數和桶個數自動增加的衡量參數,默認是160.75,當entry(即key-value對)的總個數超過指定閾值(容量×負載因子),則桶的個數以原來兩倍大小遞增,並從新進行hash計算;

3. HashMapputget操做都是常數級,迭代器的操做與容量和entry數目之和成比例;

4. fast-fail迭代器,當使用迭代器時,若是在迭代器外部對HashMap作告終構性的改動,則迭代器拋出concurrentModificationException

5. HashMap是非同步的;

6. HashMap採用鏈地址法解決衝突;

7. HashMaphash()計算,對每一個keyhashCode還進行一次計算,目的是防止低質量的hashCode

 h ^= (h >>> 20) ^ (h >>> 12);

        return h ^ (h >>> 7) ^ (h >>> 4);

————————————————————

    有關hash的詳細描述能夠參考http://www.iteye.com/topic/709945 

    經過hash以後,給定hashCode的每四位都作了不重複的^運算。儘量的保證了hashCode每一位的變化都能參與到Entry數組的hash計算中。

相關文章
相關標籤/搜索