91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java HashMap中怎么放入元素

發布時間:2021-12-31 15:54:06 來源:億速云 閱讀:147 作者:iii 欄目:編程語言

這篇文章主要講解了“Java HashMap中怎么放入元素”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java HashMap中怎么放入元素”吧!

有了hash code,來考慮如何計算放入數組的位置。hash code值通常會很大,但是數組的大小有限,默認只有16,大的也不能超過2的30次方。所以,用模運算來保證在數組大小范圍內是合理的,比如:index = hash code % array size.不過這有點慢,JDK采用了更快的算法。這個更快的算法源于一個數學規律,就是如果size是2的N次方,那么數X對size的模運算結果等價于X和size-1的按位與運算,也就是 X % size <=> X & (size -1).按位與只消耗一個CPU周期,當然快多了。現在就可理解為什么要故意把數組大小弄成2的N次方了。再回頭看一開始計算數組大小的代碼,完全理解了。

int capacity = 1;          while (capacity < initialCapacity)              capacity <<= 1;

比如size=16,二進制表示如下:(32位)

0000000000000000000000000010000

size-1=15,表示如下:

0000000000000000000000000001111

假如hash code=4

0000000000000000000000000000100

4 & 15 結果為:

0000000000000000000000000000100

假如hash code=6

0000000000000000000000000000101

6 & 15 結果為:

0000000000000000000000000000101

假如hash code=38

0000000000000000000000000100110

38 & 15 結果為:

0000000000000000000000000000110

通過觀察這三個例子,又可以發現一個特點,也就是X & size-1 的結果受到了size的階數的限制,這里size=16,階數為4.結果就是只用低4位的1和X按位與,而X的高位沒有用到。這會導致重復率相當高。如果用一個算法將X的低位重新計算,比如根據所有位的值進行重新計算,就可以使得hash值分布更均勻。下面的代碼揭示了在真正按位與之前,調用了hash函數,進行了一堆位運算。至于為什么用這個算法,我也不知道其來歷。

public V put(K key, V value) {          if (key == null)              return putForNullKey(value);          int hash = hash(key.hashCode());          int i = indexFor(hash, table.length);          for (Entry<K,V> e = table[i]; e != null; e = e.next) {              Object k;              if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {                  V oldValue = e.value;                  e.value = value;                  e.recordAccess(this);                  return oldValue;              }          }           modCount++;          addEntry(hash, key, value, i);          return null;      }       static int hash(int h) {          // This function ensures that hashCodes that differ only by          // constant multiples at each bit position have a bounded          // number of collisions (approximately 8 at default load factor).          h ^= (h >>> 20) ^ (h >>> 12);          return h ^ (h >>> 7) ^ (h >>> 4);      }       static int indexFor(int h, int length) {          return h & (length-1);      }       void addEntry(int hash, K key, V value, int bucketIndex) {          Entry<K,V> e = table[bucketIndex];          table[bucketIndex] = new Entry<K,V>(hash, key, value, e);          if (size++ >= threshold)              resize(2 * table.length);      }

上面的for循環是查找并替換符合條件的對象,如果找不到,則添加新的對象。查找到的條件(必須都滿足)是:

1.hash值相等

2.key的引用相同或者key的值相等。

感謝各位的閱讀,以上就是“Java HashMap中怎么放入元素”的內容了,經過本文的學習后,相信大家對Java HashMap中怎么放入元素這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平安县| 济南市| 元氏县| 余干县| 海淀区| 河东区| 呼和浩特市| 江陵县| 蒙自县| 道真| 临城县| 犍为县| 鹤岗市| 平舆县| 电白县| 安多县| 连州市| 英吉沙县| 礼泉县| 武山县| 汕尾市| 盈江县| 梅州市| 新晃| 渑池县| 东丰县| 鄢陵县| 临沧市| 静安区| 耿马| 湄潭县| 信宜市| 徐闻县| 龙游县| 武宣县| 佛学| 常宁市| 砚山县| 五原县| 文水县| 宜宾市|