==、equals和hashcode

==、equals和hashcode

一. == 与 equals的区别

  • 在java中,==表示比较两个对象的内存地址。如果对于一个对象,没有重写equals的话,那么就会执行Object类里面的equals()方法(因为所有的类都是继承自Object)。
  • 而Object类中的equals()方法是直接用==比较,也就是说如果一个类没有重写equals那么其equals方法等价于
    在这里插入图片描述

二. hashcode的作用

  • hashcode的作用主要是当我们用集合类的时候会用到比如HashMap
    在这里插入图片描述

  • 在HashMap中,比较两个元素是否相等,首先看hashcode如果hashcode不相等那么直接返回false,如果相等,那么在调用equals

  • 主要作用还是减少调用equals的次数,并且提高速度

三. 为什么重写equals必须重写hashcode

  • 实际应用场景中,尽管是两个对象,但是其某些属性相等我们就可以认为它们是相等的。所以需要重写equals方法

hashcode

hashcode是一个int类型的变量,其根据内存地址计算出的一个hash值,只要地址不同hashcode就不同。
所以如果单纯的只重写了equals而没有重写hashcode就会产生如下问题

重写equals未重写hashCode()

public static void main(String[] args){
    
    Person person1 = new Student("z","Maths");
    Person person2 = new Student("z","Maths");

    HashSet<Person> map = new HashSet<>();
    map.add(person1);
    map.add(person2);
    System.out.println(map.size());
    System.out.println(map);
}
class Student{
    //略
    @Override
    public boolean equals(Object o){
        if(this == o) return true;
        if(o == null || this.getClass() != o.getClass())
            return false;
        Student s = (Student) o;
        return Objects.equals(this.name,s.name);
    }
}

在这里插入图片描述

尽管属性相等,但是在hashset中却是以两个对象存储。这是因为HashSet中判断对象是否相等是根据Hashcode判断的,尽管重写了equals,但是没有重写hashcode方法所以返回的hash值还是不同,那么就会被认为是两个对象存储在HashSet中

重写equals并重写hashCode()

@Override
public int hashCode(){
    return Objects.hash(this.name);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值