温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java HashMap中怎么放入元素

发布时间:2021-12-31 15:54:06 来源:亿速云 阅读:143 作者: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