hashcode相同,equals一定相同吗?

hashcode相同,equals一定相同吗?
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 true;
    }

    @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。


版权声明:本文为hechaoyong12345原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。