重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
HashMap中的equals和hashCode
创新互联专注于瑶海企业网站建设,响应式网站开发,商城网站开发。瑶海网站建设公司,为瑶海等地区提供建站服务。全流程定制网站开发,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀。
为了说明它们的关系,我们需要HashMap的背景知识。
HashMap的存储方式:
HashMap的实现方式是数组链,不同的对象根据其哈希码hashCode方法的返回值)找到对应的数组下标,然后存入数组。不同的对象有相同的哈希码时怎么办?这就由数组链中的链来解决了,相同哈希码的对象都放在同一条链上,该链的链头指向数组,进而形成数组链。
当第一个对象已经存入HashMap,第二个对象准备存入HashMap时,系统在查找到数组下标后若发现它们的hashCode相同(数组下标相同)(也就是冲突),会调用equals()来检查它们之间的关系,会有相应有以下两种处理方法:
1. 如果相等,系统就不再存入第二个对象;
如果不等,系统视它们为纯粹的下标冲突,将它们放在同一条链上;(拉链桶)
如果它们的hashCode不相同,直接存入第二个对象。
equals()匹配但hashCode()不同:会发生不可预料的事情
现在假设有两个对象,它们的equals()相匹配,但hashCode()却不同,让我们好好分析一下当它们存入HashMap时会发生什么。
假设StringA和StringB是两个不同的对象,内容都是”hello,world”,equals()返回true,但hashCode()返回值不一样。我们把StringA和StringB当作Key,分别对应着ValueA和ValueB。
在StringA和ValueA已经存入HashMap后,我们尝试存入StringB和ValueB,因为hashCode不同,StringB和ValueB顺利地进入HashMap.
我们写一个查询:HashMap.get(“hello,world”),此时会发生什么呢?我们取回的究竟是ValueA还是ValueB?不可预料。
或者换一下,我们写一个查询:HashMap.get(StringA),此时会发生什么呢?我们取回的究竟是ValueA还是ValueB?不可预料。
再换一下,我们写一个查询:HashMap.get(StringB),此时会发生什么呢?我们取回的究竟是ValueA还是ValueB?不可预料。
所以我们常说,如果equals匹配,hashCode()一定要相同,不然就有神奇的事情发生。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。