温馨提示×

温馨提示×

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

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

java中HashMap当插入位置不为空的时候JDK是怎么处理

发布时间:2021-11-24 17:36:58 来源:亿速云 阅读:194 作者:小新 栏目:大数据

小编给大家分享一下java中HashMap当插入位置不为空的时候JDK是怎么处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

首先是源码:

java中HashMap当插入位置不为空的时候JDK是怎么处理

可以看到当插入的位置不为空时会有三种情况:

1、首先会判断p(当前要插入位置的元素)的hash值是否与待插入数据的hash值一致,如果一致再判断key是否一致,如果都一致那么将p赋值给e,然后结束该判断

2、如果条件一不成立判断p是否是TreeNode(实际TreeNode就是红黑树的简单实现,红黑树会在将TreeMap时讲解),如果是那么直接将待插入的值插入该节点。

3、如果以上两种情况都不符合,那么进入第三种(此时p节点是一个链表,是链式存储的)。首先是定义了一个for循环,可以看到该for循环没有显式指定自动退出条件,也就是说该for循环是手动退出的。

首先我们看for循环的循环体

(1)首先是判断p是否还有下一个,如果没有那么将要插入的信息构建为一个节点然后判断binCount是否大于等于TREEIFY_THRESHOLD - 1(TREEIFY_THRESHOLD为HashMap中定义的一个常量,值为8),如果大于这个值的话就调用treeifyBin,该操作是构建一个红黑树,后续讲TreeMap时会讲到,此处不做过多解释。至于为什么这么做?是因为当数据少的时候用链表遍历还是比较快的,但是当数据多的时候用链表就会比较慢了,而为了避免因此拖慢HashMap的效率,当数据多的时候此处会自动用红黑树代替(可以从一定程度上避免hash碰撞攻击),而JDK开发人员认为当数据大于等于8个时就比较多了,需要用红黑树代替链表了。进行完上述操作后for循环中断。

(2)如果p还有下一个,那么进入另外一个判断,判断下一个节点的key和hash值是否与待插入的key和hash值相同,如果相同那么就直接跳出循环。

(3)如果上述两种情况都没命中,那么就将下个节点的引用赋值给当前循环的这个节点p,然后继续循环,直到循环退出。

以上三种情况都判断完毕后,判断此时的e是否等于null,如果不等于null说明经过上述流程后得出一个结论,那就是要放入的key在原来是已经存在的,只需将原来的key对应的value替换为新的value值即可。

以上是“java中HashMap当插入位置不为空的时候JDK是怎么处理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI