hashcode相同,equals一定相同吗?
2019-10-31 本文已影响0人
喵感数据
hashcode相同,equals一定相同吗?对于初学java的同学可能会感到疑惑,hashcode相同的话,equals肯定返回true呀?
真是这样吗?其实不然,我们以HashMap为列?
public class JavaMethod {
public static void main(String[] args) {
HashMap<HashCodeTest, Object> map = new HashMap<HashCodeTest, Object>();
HashCodeTest codeTest1 = new HashCodeTest();
HashCodeTest codeTest2 = new HashCodeTest();
map.put(codeTest1,new Object());//第一次put
map.put(codeTest2,new Object());//第二次put
System.out.println(map.size());//输出结果
}
}
//重写的hashcode和equals方法
class HashCodeTest {
@Override
public boolean equals(Object obj) {
System.out.println("重写的equals方法");
return false;
}
@Override
public int hashCode() {
System.out.println("重写的hashcode方法");
return 10086;
}
}
输出结果:
重写的hashcode方法
重写的hashcode方法
重写的equals方法
2
为什么会输出这种结果呢?其实很好理解:map在第一次调用put的方法时,会通过haahcode方法先判断该类的地址是否相同,因为第一次进行put时,map里没有任何东西,此时hashcode显然是不同的。
在第二次put时,程序会继续先判断hashcode是否相同,因为重写的hashcode方法返回的结果都是10086,是同一结果,hash值是相同的;然后程序会继续判断equals的值是否相同,因为重写的equals方法返回的是false,值永远不会相同。
所以程序会判定map的两个key键是不同的,所以输出长度为2。如果把重写的equals方法返回值改为true,则输出的map长度就是1。
————————————————