HashMap的構造函數(三)


本文主要通過HashMap構造函數講解initialCapacity、threshold和loadFactor三個參數的前生今世。

看源碼:

 1     public HashMap(int initialCapacity, float loadFactor) {
 2         if (initialCapacity < 0)
 3             throw new IllegalArgumentException("Illegal initial capacity: " +
 4                                                initialCapacity);
 5         if (initialCapacity > MAXIMUM_CAPACITY)
 6             initialCapacity = MAXIMUM_CAPACITY;
 7         if (loadFactor <= 0 || Float.isNaN(loadFactor))
 8             throw new IllegalArgumentException("Illegal load factor: " +
 9                                                loadFactor);
10         this.loadFactor = loadFactor;
11         this.threshold = tableSizeFor(initialCapacity);
12     }
13 
14     
15     public HashMap(int initialCapacity) {
16         this(initialCapacity, DEFAULT_LOAD_FACTOR);
17     }
18 
19 
20     public HashMap() {
21         this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
22     }
23 
24     
25     public HashMap(Map<? extends K, ? extends V> m) {
26         this.loadFactor = DEFAULT_LOAD_FACTOR;
27         putMapEntries(m, false);
28     }

構造器源碼十分簡單,就是初始化幾個參數,這里不做過多講解,下面着重講initialCapacity、threshold和loadFactor這三個參數:

size:size為HashMap中鍵值對總數。

initialCapacity:初始容量,從上面第11行代碼我們看到,初始容量數值沒有存起來,而且使用它計算閥值threshold。計算方法就是返回大於initialCapacity且最接近initialCapacity的一個2的正數冪的數字作為初始閥值。

capacity:容量。capacity就是指HashMap中桶的數量。默認值為16。一般第一次擴容時會擴容到64,之后都是以2的冪數增加。

loadFactor:裝載因子,用來衡量HashMap滿的程度,加載因子越大,填滿的元素越多,空間利用率越高。loadFactor的默認值為0.75f。計算HashMap的實時裝載因子的方法為size/capacity。至於默認值為什么是0.75,可以閱讀HashMap的數據結構(一)

threshold:閥值,滿足公式threshold=loadFactor*capacity。當HashMap的size大於threshold時會執行擴容(resize)操作。

 理解這些參數對閱讀源碼和HashMap使用有很重要的作用,實際使用中,如果你可以預估元素大小,指定初始容量值,就會省去擴容操作的時間,提高程序運行效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM