摘要:創(chuàng)建時傳入初始化容量和負(fù)載系數(shù)初始化容量顧名思義這個參數(shù)定義了這個的初始大小小于零會拋出非法參數(shù)異常大于的三十次方則默認(rèn)等于的三十次方負(fù)載因子當(dāng)你的需要擴(kuò)容時擴(kuò)容容量添加方法會用到此方法無符號右移相當(dāng)于加一做或運算后把值存到左邊的變量或運
1.創(chuàng)建HashMap時傳入初始化容量和負(fù)載系數(shù)
initialCapacity(初始化容量):顧名思義,這個參數(shù)定義了這個HashMap的初始大小;小于零會拋出非法參數(shù)異常,大于MAXIMUM_CAPACITY(2的三十次方)則默認(rèn)等于2的三十次方
loadFactor(負(fù)載因子):
public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); }
threshold:當(dāng)你的HashMap需要擴(kuò)容時,擴(kuò)容容量(添加方法put會用到此方法)
static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
">>>":無符號右移(相當(dāng)于加一)
"|="做或運算后把值存到左邊的變量("或運算":有1結(jié)果為1,全為0結(jié)果為0)
為什么要對cap做減1操作?這是為了防止cap已經(jīng)是2的冪.如果cap已經(jīng)是2的冪,又沒有執(zhí)行這個減1操作,則執(zhí)行完后面的幾條無符號右移操作之后,返回的capacity將是這個cap的2倍.最后+1,使之成為2的冪
非常牛的一個算法,用于找到大于等于initialCapacity的最小的2的冪(不懂的http://www.th7.cn/Program/jav... 這里不做贅述)
public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); }
默認(rèn)負(fù)載因子DEFAULT_LOAD_FACTOR = 0.75f
3.創(chuàng)建HashMap時不傳入任何參數(shù)public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; }4.創(chuàng)建HashMap時傳入一個實現(xiàn)了Map接口的對象,此HashMap創(chuàng)建后會包括此Map的所有內(nèi)容
public HashMap(Map extends K, ? extends V> m) { this.loadFactor = DEFAULT_LOAD_FACTOR; putMapEntries(m, false); }
final void putMapEntries(Map extends K, ? extends V> m, boolean evict) { int s = m.size(); if (s > 0) { if (table == null) { float ft = ((float)s / loadFactor) + 1.0F; int t = ((ft < (float)MAXIMUM_CAPACITY) ? (int)ft : MAXIMUM_CAPACITY); if (t > threshold) threshold = tableSizeFor(t); } else if (s > threshold) // 傳入Map的size大于擴(kuò)容容量,resize方法為重新初始化一下容量 resize(); for (Map.Entry extends K, ? extends V> e : m.entrySet()) { K key = e.getKey(); V value = e.getValue(); putVal(hash(key), key, value, false, evict);// 相當(dāng)于put方法,請看下回分解 } } }
table:Node類型,做為空判斷是否為新創(chuàng)建.
ft:是否要擴(kuò)容的操作(為什么+1我現(xiàn)在只有個模糊的感覺,先留個坑)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67970.html
摘要:類庫中提供了一套相當(dāng)完整的容器類來解決這個問題,其中基本類型有,,,,這些對象類型被稱為集合類。但是,類庫中使用了來指代集合類中的子集,,,所以集合類也被稱為容器。五類型是能夠?qū)ο笥成涞狡渌麑ο蟮囊环N容器,有區(qū)別于的方法。 引言 如果一個程序只包含固定數(shù)量的且其生命周期都是已知對象,那么這是一個非常簡單的程序——《think in java》 了解容器前,先提出一個問題,ArrayL...
摘要:是一門最近比較流行的靜態(tài)類型編程語言,而且和一樣同屬系。這個生成的構(gòu)造函數(shù)是合成的,因此不能從或中直接調(diào)用,但可以使用反射調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000012958496); Kotlin是一門最近比較流行的靜態(tài)類型編程語言,而且和Groovy、Scala一樣同屬Java系。Kotlin具有的很多靜態(tài)語言...
摘要:當(dāng)沖突的個數(shù)比較少時,使用鏈表,否則使用紅黑樹。這樣做的好處是,最壞的情況下即所有的都沖突,采用鏈表的話查找時間為而采用紅黑樹為,這也是中性能提升的奧秘,詳細(xì)的測試可以看這篇博文。 HashMap是我們最常用的集合之一,同時Java8也提升了HashMap的性能。本著學(xué)習(xí)的原則,在這探討一下HashMap。 原理 簡單講解下HashMap的原理:HashMap基于Hash算法,我們...
摘要:跟一樣,它不是為移動應(yīng)用設(shè)計的,但是它的特性和簡單可以讓我們很好的在安卓項目中采用。架構(gòu)在安卓開發(fā)中使用設(shè)計規(guī)范的目的是建立一個在簡單性與易擴(kuò)展易測試之間都比較平衡的架構(gòu)。第一步是找到元素和安卓組件之間的映射。一個,裝載了本次操作。 序言 之前寫過一篇關(guān)于Android項目如何架構(gòu)的,有MVC和MCVP,前幾天又看到了新的一種架構(gòu),當(dāng)然并不是新出的,出了有一段時間,當(dāng)前被應(yīng)用的并不是很...
閱讀 2680·2021-11-18 10:02
閱讀 3452·2021-09-22 15:50
閱讀 2373·2021-09-06 15:02
閱讀 3593·2019-08-29 16:34
閱讀 1756·2019-08-29 13:49
閱讀 1289·2019-08-29 13:29
閱讀 3651·2019-08-28 18:08
閱讀 2986·2019-08-26 11:52