中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

宜宾县| 阿拉尔市| 南岸区| 宝清县| 广德县| 茌平县| 安溪县| 前郭尔| 宁强县| 盐源县| 乌拉特后旗| 华坪县| 澄迈县| 玉山县| 合阳县| 建昌县| 渝中区| 远安县| 山西省| 贵阳市| 香格里拉县| 老河口市| 岫岩| 云林县| 静乐县| 安庆市| 南昌县| 沂源县| 瑞安市| 那坡县| 聂荣县| 穆棱市| 吴桥县| 大竹县| 舒城县| 旬阳县| 泰兴市| 渭源县| 抚顺市| 怀集县| 若尔盖县|