大数据

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。

————————————————

上一篇下一篇

猜你喜欢

热点阅读