概述
java.util.hashMap如何处理冲突
解决冲突的位数我们可以知道,是在
插入键值对和
读取键值对的地方需要对冲突进行处理。
/****************************************************
put源码分析*************************************************************************/
分析:
通过分析下面的源码,我们用2个测试用例在说明
# 第一个测试用例是:当插入的实体哈希值hash一样,但是key.equal(k)为false,
这个时候插入的时会被当成新节点直接进入到节点栈(单向链表栈)的顶部,并返回 newValue。
# 第二个测试用例是:当插入的实体哈希值hash一样,但是key.equal(k)为true,
这个时候插入的时会覆盖原先位于节点栈的键值oldValue,并返回oldValue。
======================================
/***********************************************
get 源码分析*****************************************************************/
分析:
通过分析下面的源码,我们用2个测试用例在说明
# 第一个测试用例是:当获取的实体哈希值hash一样,但是key.equal(k)为false,
这个时候这个时候会返回null。(这种情况发送的原因是,你从来都没有插入过这个对象,就算hash一样,但是key.equal(k)为false ,就证明你没插入过,只要插入过,键值对就会存在,之后key.equal(k)一定为true )
# 第二个测试用例是:当获取的实体哈希值hash一样,但是key.equal(k)为true,
这个时候会直接返回第一个key.equal(k)为true的值(靠近栈顶的),事实上因为插入的时候会产生覆盖,所以一个Map不会存在2个Key的hash和equal同时成立的键值对。
###################################################################################
总结:
在插入map的时候是由hash()和equal()2个函数共同影响的。
总的来说map会竟可能的保证数据存储冲突的情况map还能正常工作(hash相同不影响插入和获取,hashMap采用节点链栈的形式处理冲突,但是equal()相同就会覆盖了)。
但是在不得已的情况下就会产生预想不到的与数据覆盖(hash()和equal() 都相同的情况下会覆盖)。
所以在设计hash函数的时候,不用担心冲突了怎么办,万一hash冲突了顶多也就是查询的效率会减低为O(n)而已。
但是如果equal设计的不好(没有按照需求),就会出现不希望发生的覆盖了。
最后
以上就是土豪眼睛为你收集整理的java.util.hashMap如何处理冲突的全部内容,希望文章能够帮你解决java.util.hashMap如何处理冲突所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复