我是靠谱客的博主 土豪眼睛,最近开发中收集的这篇文章主要介绍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设计的不好(没有按照需求),就会出现不希望发生的覆盖了。

最后

以上就是土豪眼睛为你收集整理的java.util.hashMap如何处理冲突的全部内容,希望文章能够帮你解决java.util.hashMap如何处理冲突所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部