java.util.hashMap如何处理冲突

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设计的不好(没有按照需求),就会出现不希望发生的覆盖了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值