您好,登錄后才能下訂單哦!
這篇文章主要講解了“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中怎么放入元素這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。