HashMap中的equals和hashCode数组
Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的做用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀。ide
为了说明它们的关系,咱们须要HashMap的背景知识。对象
HashMap的存储方式:
HashMap的实现方式是数组链,不一样的对象根据其哈希码hashCode方法的返回值)找到对应的数组下标,而后存入数组。不一样的对象有相同的哈希码时怎么办?这就由数组链中的链来解决了,相同哈希码的对象都放在同一条链上,该链的链头指向数组,进而造成数组链。get
当第一个对象已经存入HashMap,第二个对象准备存入HashMap时,系统在查找到数组下标后若发现它们的hashCode相同(数组下标相同)(也就是冲突),会调用equals()来检查它们之间的关系,会有相应有如下两种处理方法:
1. 若是相等,系统就再也不存入第二个对象;
若是不等,系统视它们为纯粹的下标冲突,将它们放在同一条链上;(拉链桶)
若是它们的hashCode不相同,直接存入第二个对象。源码
equals()匹配但hashCode()不一样:会发生不可预料的事情
如今假设有两个对象,它们的equals()相匹配,但hashCode()却不一样,让咱们好好分析一下当它们存入HashMap时会发生什么。hash
假设StringA和StringB是两个不一样的对象,内容都是”hello,world”,equals()返回true,但hashCode()返回值不同。咱们把StringA和StringB看成Key,分别对应着ValueA和ValueB。it
在StringA和ValueA已经存入HashMap后,咱们尝试存入StringB和ValueB,由于hashCode不一样,StringB和ValueB顺利地进入HashMap.class
咱们写一个查询:HashMap.get(“hello,world”),此时会发生什么呢?咱们取回的到底是ValueA仍是ValueB?不可预料。方法
或者换一下,咱们写一个查询:HashMap.get(StringA),此时会发生什么呢?咱们取回的到底是ValueA仍是ValueB?不可预料。查询
再换一下,咱们写一个查询:HashMap.get(StringB),此时会发生什么呢?咱们取回的到底是ValueA仍是ValueB?不可预料。
因此咱们常说,若是equals匹配,hashCode()必定要相同,否则就有神奇的事情发生。