java重写equals()方法和hashCode()方法

1.equals()方法和hashCode()方法是什么?
  1. equals()和hashCode()都是是Java中万物之源Object类中的方法;
  2. equals方法用于比较两个对象是否相同,Object类中equals方法的实现是比较引用地址来判断的对象是否是同一个对象,通过覆盖该方法可以实现自定义的判断规则;
  3. hashCode是jdk根据对象的地址或者字符串或者数字计算该对象的哈希码值的方法。
2.为什么要重写equals()方法?
  1. Object类中equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个地址是相等的,否则这两个对象就不想等。
  2. 如果有两个对象,他们的属性是相同的,但是地址不同,这样使用equals()比较得出的结果是不相等的,而我们需要的是这两个对象相等,因此默认的equals()方法是不符合我们的要求的,这个时候我们就需要对equals()方法进行重写以满足我们的预期结果。
  3. 在java的集合框架中需要用到equals()方法进行查找对象,如果集合中存放的是自定义类型,并且没有重写equals()方法,则会调用Object父类中的equals()方法按照地址比较,往往会出现错误的结果,此时我们应该根据业务需求重写equals()方法。
3.为什么要重写hashCode()方法?
  1. hashCode()方法用于散列数据的快速存储,HashSet/HashMap/Hashtable类存储数据时都是根据存储对象的hashcode值来进行分类存储的,一般先根据hashcode值在集合中进行分类,在根据equals()方法判断对象是否相同。
  2. HashMap对象是根据其Key的hashCode来获取对应的Value。
  3. 生成一个好的hashCode值能提高HashSet查找的性能,差的hashCode值不但不能提高性能,甚至可能造成错误。比如hashCode方法中返回常量,会让,HashSet的查找效率退化为List集合的查找效率;hashCode方法中返回随机数,会让查找结果变的不可预测。
  4. 好的hashCode生成方式是让对象中的关键属性与质数相乘,并将积相加获取。
4.为什么java中在重写equals()方法后必须对hashCode()方法进行重写?
  1. 为了维护hashCode()方法的equals协定,该协定指出:如果根据 equals()方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果;而两个hashCode()返回的结果相等,两个对象的equals()方法不一定相等。
  2. HashMap对象是根据其Key的hashCode来获取对应的Value。
  3. 在重写父类的equals()方法时,也重写hashcode()方法,使相等的两个对象获取的HashCode值也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。
5.重写equals()方法:

重写equals方法需要遵循Java如下规则,否则编码行为会难以揣测:

  1. 自反性:对于任意的对象x,x.equals(x)返回true(自己一定等于自己);
  2. 对称性:对于任意的对象x和y,若x.equals(y)为true,则y.equals(x)亦为true;
  3. 传递性:对于任意的对象x、y和z,若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;
  4. 一致性:对于任意的对象x和y,x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,前提条件是没有修改x也没有修改y;
  5. 对于非空引用x,x.equals(null)永远返回为false。

重写代码如下:


    @Override
    public boolean equals(Object o) {
        //自反性
        if (this == o) return true;
        //任何对象不等于null,比较是否为同一类型
        if (!(o instanceof Person)) return false;
        //强制类型转换
        Person person = (Person) o;
        //比较属性值
        return getId() == person.getId() &&
                Objects.equals(getName(), person.getName()) &&
                Objects.equals(getSex(), person.getSex());
    }
6.重写hashCode()方法:

HashMap对象是根据其Key的hashCode来获取对应的Value。
在重写父类的equals方法时,也重写hashcode方法,使相等的两个对象获取的HashCode也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。

重写hashCode()方法需要遵循hashCode()协定:

  1. 一致性:在Java应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行hashcode比较时所用的信息没有被修改。
  2. equals:如果根据equals()方法比较,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode()方法都必须生成相同的整数结果,注:这里说的equals()方法是指Object类中未被子类重写过的equals()方法。
  3. 附加:如果根据equals()方法比较,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode方法不一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

重写代码如下:


    @Override
    public int hashCode() {
        return Objects.hash(getId(), getName(), getSex());
    }

查看源代码

  • 40
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Java中,hashcodeequals方法是用于比较对象的重要方法。当我们需要比较两个对象是否相等时,就需要重写这两个方法hashcode方法是用于获取对象的哈希码,它返回一个int类型的值。在重写hashcode方法时,我们需要保证相等的对象返回相同的哈希码,这样才能保证在使用哈希表等数据结构时,对象能够正确地被存储和查找。 equals方法是用于比较两个对象是否相等,它返回一个boolean类型的值。在重写equals方法时,我们需要保证相等的对象返回true,不相等的对象返回false。通常情况下,我们需要比较对象的属性值是否相等来判断两个对象是否相等。 需要注意的是,当我们重写equals方法时,也需要同时重写hashcode方法,否则在使用哈希表等数据结构时,可能会出现错误。 ### 回答2: hashcodeequals都属于Object类中的方法,而在Java中,许多数据结构都需要根据对象的hashcodeequals方法来判断某个对象在数据结构中的位置和是否相等。因此,我们通常需要重写这两个方法来满足自己的需求。 hashcode方法是返回某个对象的哈希码,它的作用是在HashMap、HashSet等数据结构中对对象进行分类。如果两个对象使用equals方法比较返回true,那么它们的hashcode方法必须返回相同的值,否则可能会造成数据结构失效导致数据无法取出。如果两个对象的hashcode值相等,但是使用equals方法比较返回false,这种情况称为哈希冲突。我们可以通过提高哈希冲突的概率来提高数据访问效率,例如优化哈希函数或者增大哈希表的容量。 equals方法是用来比较两个对象是否相等,我们可以根据对象中的属性来自定义相等的规则。常见的重写方式是比较对象中每个属性的值是否相等。需要注意的是,我们需要保证equals方法满足自反性、对称性、传递性和一致性等特征,否则可能导致数据结构错误或程序异常。 在Java中,通常当我们自定义一个类时,需要重写这两个方法以保证程序的正确性和程序运行效率。重写方法要根据实际情况来选择,我们可以根据每个对象的属性来计算hashcode,也可以使用一些第三方框架来自动实现equalshashcode方法,例如lombok、Apache Commons等。无论选择哪种方式,我们都要保证程序正确性和运行效率的平衡。 ### 回答3: Java中的hashcodeequals方法是常用的对象方法,它们的作用是对对象进行操作和比较。在使用Java集合类时,如HashMap、HashSet、HashTable等都会用到hashcodeequals方法hashcode方法是Object类中定义的方法,它返回对象的哈希码值。哈希码值是一个int类型的整数,它通过将该对象的内部地址转换成一个整数来计算。如果需要使用自定义的容器或自定义的集合类时,需要重写hashcode方法以提高容器性能。 equals方法也是Object类中定义的方法,它用于比较两个对象是否相等。当需要判断两个对象是否相等时,就需要重写equals方法。通常情况下,equals方法比较的是对象的属性值,所以在实现equals方法时需要考虑对象的属性。 在重写equals方法时,需要注意以下几点: 1. 重写equals方法时,需要保证它遵循自反性、对称性、传递性和一致性这四个基本原则。 2. 对象相等的条件是对象的属性值相等,而不是内存地址相等。 3. 在比较对象属性时,需要避免空指针异常。 4. 当对象中包含集合类型的属性时,在比较集合类型属性时需要递归比较每个元素。 当对hashcodeequals方法进行重写时,需要同时重写。如果两个对象的equals方法返回true,那么它们的hashcode也应该相同。同时,如果两个对象的hashcode相同,那么它们不一定相等,需要通过equals方法再次比较。 总之,对hashcodeequals方法重写可以提高Java容器的性能,也可以确保对象比较的正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值