摘要:創建時傳入初始化容量和負載系數初始化容量顧名思義這個參數定義了這個的初始大小小于零會拋出非法參數異常大于的三十次方則默認等于的三十次方負載因子當你的需要擴容時擴容容量添加方法會用到此方法無符號右移相當于加一做或運算后把值存到左邊的變量或運
1.創建HashMap時傳入初始化容量和負載系數
initialCapacity(初始化容量):顧名思義,這個參數定義了這個HashMap的初始大小;小于零會拋出非法參數異常,大于MAXIMUM_CAPACITY(2的三十次方)則默認等于2的三十次方
loadFactor(負載因子):
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:當你的HashMap需要擴容時,擴容容量(添加方法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; }
">>>":無符號右移(相當于加一)
"|="做或運算后把值存到左邊的變量("或運算":有1結果為1,全為0結果為0)
為什么要對cap做減1操作?這是為了防止cap已經是2的冪.如果cap已經是2的冪,又沒有執行這個減1操作,則執行完后面的幾條無符號右移操作之后,返回的capacity將是這個cap的2倍.最后+1,使之成為2的冪
非常牛的一個算法,用于找到大于等于initialCapacity的最小的2的冪(不懂的http://www.th7.cn/Program/jav... 這里不做贅述)
public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); }
默認負載因子DEFAULT_LOAD_FACTOR = 0.75f
3.創建HashMap時不傳入任何參數public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; }4.創建HashMap時傳入一個實現了Map接口的對象,此HashMap創建后會包括此Map的所有內容
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大于擴容容量,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);// 相當于put方法,請看下回分解 } } }
table:Node類型,做為空判斷是否為新創建.
ft:是否要擴容的操作(為什么+1我現在只有個模糊的感覺,先留個坑)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67970.html
摘要:類庫中提供了一套相當完整的容器類來解決這個問題,其中基本類型有,,,,這些對象類型被稱為集合類。但是,類庫中使用了來指代集合類中的子集,,,所以集合類也被稱為容器。五類型是能夠將對象映射到其他對象的一種容器,有區別于的方法。 引言 如果一個程序只包含固定數量的且其生命周期都是已知對象,那么這是一個非常簡單的程序——《think in java》 了解容器前,先提出一個問題,ArrayL...
摘要:是一門最近比較流行的靜態類型編程語言,而且和一樣同屬系。這個生成的構造函數是合成的,因此不能從或中直接調用,但可以使用反射調用。 showImg(https://segmentfault.com/img/remote/1460000012958496); Kotlin是一門最近比較流行的靜態類型編程語言,而且和Groovy、Scala一樣同屬Java系。Kotlin具有的很多靜態語言...
摘要:當沖突的個數比較少時,使用鏈表,否則使用紅黑樹。這樣做的好處是,最壞的情況下即所有的都沖突,采用鏈表的話查找時間為而采用紅黑樹為,這也是中性能提升的奧秘,詳細的測試可以看這篇博文。 HashMap是我們最常用的集合之一,同時Java8也提升了HashMap的性能。本著學習的原則,在這探討一下HashMap。 原理 簡單講解下HashMap的原理:HashMap基于Hash算法,我們...
摘要:跟一樣,它不是為移動應用設計的,但是它的特性和簡單可以讓我們很好的在安卓項目中采用。架構在安卓開發中使用設計規范的目的是建立一個在簡單性與易擴展易測試之間都比較平衡的架構。第一步是找到元素和安卓組件之間的映射。一個,裝載了本次操作。 序言 之前寫過一篇關于Android項目如何架構的,有MVC和MCVP,前幾天又看到了新的一種架構,當然并不是新出的,出了有一段時間,當前被應用的并不是很...
閱讀 2664·2021-11-18 10:02
閱讀 3426·2021-09-22 15:50
閱讀 2359·2021-09-06 15:02
閱讀 3578·2019-08-29 16:34
閱讀 1745·2019-08-29 13:49
閱讀 1275·2019-08-29 13:29
閱讀 3629·2019-08-28 18:08
閱讀 2937·2019-08-26 11:52