HashMap學習筆記 目前JDK1.7(還沒看完)

HasMap源碼閱讀

JDK1.7 HashMap源碼

繼承關係

1.繼承了AbstractMap

2.實現了Map接口,擁有一組Map通用操作

3.實現了Cloneable接口,可以進行拷貝

4.實現了Serializable接口,可以將HashMap對象保存至本地

註釋說明

1.允許鍵/值為空對象

2.非線程安全

3.HashMap內的元素是無序的

翻譯:基於哈希表的Map接口實現。此實現提供所有可選映射操作,並允許null值和null鍵。(HashMap類大致等價於Hashtable,但它是不同步的,允許nulls)。)這個類不保證map的順序;特別是,它不保證order會隨著時間的推移保持不變。

4.初始容量過高影響迭代性能

翻譯:這個實現為基本操作提供了常量時間性能(get, set),假設哈希函數在存儲桶中適當地分散元素。對集合視圖的迭代需要與HashMap實例的“容量”(bucket的數量)和它的大小(鍵值映射的數量)成正比的時間。因此,如果迭代性能很重要,不要將初始容量設置得過高(或者負載因素過低)。

5.影響性能參數initial capacity(初始容量),load factor負載因子

翻譯:HashMap有兩個影響其性能的參數:初始容量和負載因子。容量是哈希表中的桶數,初始容量只是創建哈希表時的容量。load factor是在哈希表的容量自動增加之前允許哈希表達到多少滿的度量。當哈希表中的條目數超過負載因子和當前容量的乘積時,哈希表是rehash (也就是說,內部數據結構被重建),這樣哈希表大約有兩倍的桶數。

6.初始容量:16

//默認初始容量——必須是2的冪。

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

7.負載因子初始:0.75f

static final float DEFAULT_LOAD_FACTOR = 0.75f;

翻譯: 一般來說,默認負載因數(.75)在時間和空間成本之間提供了很好的權衡。更高的值減少了空間開銷,但增加了查找成本(反映在HashMap類的大多數操作中,包括get, put))。在設置映射的初始容量時,應該考慮映射中預期的條目數量及其負載因數,以最小化rehash操作的數量。如果初始容量大於按負載因素劃分的最大條目數,則不會發生重新散列操作。

翻譯:如果要將許多映射存儲在HashMap實例中,那麼創建具有足夠大容量的映射將使映射被更有效地存儲,而不是讓它根據需要自動執行重新哈希以擴展表。

8.推薦同步方法Collections.synchronizedMap(new HashMap(…))

翻譯:注意此實現不同步。

如果多個線程同時訪問散列映射,並且至少有一個線程在結構上修改映射,那麼它必須在外部同步。(結構修改是添加或刪除一個或多個映射的操作;僅僅更改與實例已經包含的鍵相關聯的值並不是結構性修改。這通常是通過對一些自然封裝映射的對象進行同步來實現的。

如果不存在這樣的對象,則應該使用Collection #synchronizedMap Collections.synchronizedMap方法。最好在創建時執行,以防止意外地不同步地訪問映射:

Map m = Collections.synchronizedMap(new HashMap(…));

翻譯:這個類的所有“collection view methods”返回的迭代器都是fail-fast:如果在創建迭代器後的任何時候對映射進行結構修改,除了通過迭代器自己的remove方法外,迭代器將拋出一個ConcurrentModificationException。因此,在面對併發修改時,迭代器會快速而乾淨地失敗,而不會在將來的某個不確定的時間冒險使用任意的、不確定的行為。

注意,迭代器的快速故障行為不能得到保證,因為通常來說,在存在不同步併發修改的情況下,不可能做出任何硬保證。快速故障迭代器以最大的努力拋出ConcurrentModificationException。因此,編寫依賴於此異常的程序以確保其正確性是錯誤的:迭代器的快速故障行為應該只用於檢測錯誤

這個類是java集合框架

屬性說明

1. DEFAULT_INITIAL_CAPACITY初始容量:16

//必須是2的冪

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

2. MAXIMUM_CAPACITY最大容量:2的30次方

//如果具有參數的構造函數中的任何一個隱式地指定了更高的值,則使用最大容量。必//須是2 <= 1< 30的冪。 左移n位相當於2的n次方

static final int MAXIMUM_CAPACITY = 1 << 30;

3. DEFAULT_LOAD_FACTOR負載因子:0.75f

//在構造函數中未指定時使用的負載因數。默認負載因子大小

static final float DEFAULT_LOAD_FACTOR = 0.75f;

4. EMPTY_TABLE共享的空表實例。

static

final Entry,?>[] EMPTY_TABLE = {};

5. table這個表按需要調整了大小。長度必須始終是2的冪。

Transient Entry<K,V>[] table = (Entry<K,V>)EMPTY_TABLE;

6.size Map中key-value mapping 的數量

transient int size;

方法來源於:Abstractmap 這個抽象類

7. threshold size>=threshold就會擴容

要調整大小的下一個大小值(容量*負載因數)

// If table == EMPTY_TABLE then this is the initial capacity at which the table will be created when inflated.

//如果表== EMPTY_TABLE,那麼這是擴張時創建表的初始容量。

int threshold;


分享到:


相關文章: