重写equals 为什么一定要重写hashcode?

我们新建一个类时,都是默认继承Object类,Object类的equals方法是比较是否指向同一个对象(对象内存地址是否相同)

equals与hashCode是Object类是两个方法,非常重要

查看Object源码

    public native int hashCode();

    public boolean equals(Object obj) {
        return (this == obj);
    }

 

一个类只重写了equals方法,那么对象equals为true,不重写hashCode,会默认使用object的hashcode方法,object的hashcode是本地方法,java的内存是安全的,因此无法根据散列码得到对象的内存地址

注: hashcode是根据内存地址计算出来的,

因此equals比较为true,hashcode比较为false

那么对于hash散列表结构的容器集合,就会出现问题

实际用代码验证:

import java.util.Objects;

public class User {
    private int id;

    private String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                Objects.equals(name, user.name);
    }


    public static void main(String[] args) {
        User u1=new User(1,"kevin");
        User u2=new User(1,"kevin");

        System.out.println("equals比较结果:"+(u1.equals(u2)));
        System.out.println("hashcode比较结果: "+(u1.hashCode()==u2.hashCode()));
    }
}

运行结果:

   equals比较结果  :true
   hashcode比较    :false

 u1.equals(u2)为true,根据hashcode 规则,两个对象相等,hashcode一定相等,这里就矛盾了.

关于hashcode与equals总结:

  两个对象相等,hashcode一定要相同.
  两个对象不相等,hashcode不一定不相等
  hashcode相等,两个对象不一定相等
  hashcode不相等,两个对象一定不等.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值