理解重写equals一定要重写hashcode

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

     @Override
       public int hashCode() {
           return Objects.hash(id, userName, age);
       }

假设有两个对象:

User user = new User();

        user.setId(1);

        User user1 = new User();

        user1.setId(1);

重写了equals和hashcode

System.out.println(user.equals(user1));//true

System.out.println(user.hashCode() == user1.hashCode());//true

反之只重写equals:

//true

//false

也就是说 hashcode相当于我们的身份证号,两个对象相等,hashcode一定相等;hashcode不等,两个对象一定不等。

现在,再加一行代码 user1=user;

//true

//true

说明hashcode代表了指针/内存地址。

 

最后,提出关键性的疑问,什么时候我会用到hashcode呢,hashcode不相等关我什么事呢,我只用到equals判断满足我的要求了不就行了?

试试map.put(user,xxx);//  map key唯一性

     Map<User,Integer> map = new HashMap<>();

        map.put(user,1);

        map.put(user1,2);

        System.out.println(map);

重写hashcode输出:

{User{id=1, username='null', age=null}=2}

不重写hashcode输出:

{User{id=1, username='null', age=null}=2, User{id=1, username='null', age=null}=1}

总结

  • 两个对象相等,hashcode一定相等,hashcode不等,两个对象一定不等。
  • 单纯只判断对象属性值,可以只写equals不写hashcode,只是不完整(男的光着上身打篮球警察也不会抓你)。
  • 如果对象作为map的key,那就必须重写hashcode,因为map是根据hashcode来控制key唯一性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值