java中HashMap当插入位置不为空的时候JDK是怎么处理
小编给大家分享一下java中HashMap当插入位置不为空的时候JDK是怎么处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
10年积累的成都做网站、网站设计、外贸营销网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计制作后付款的网站建设流程,更有兴宁免费网站建设让你可以放心的选择与我们合作。
首先是源码:
可以看到当插入的位置不为空时会有三种情况:
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是怎么处理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
网页标题:java中HashMap当插入位置不为空的时候JDK是怎么处理
分享地址:http://ybzwz.com/article/isjhsh.html