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。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值