本文主要通過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使用有很重要的作用,實際使用中,如果你可以預估元素大小,指定初始容量值,就會省去擴容操作的時間,提高程序運行效率。