为什么要重写equals()?

为什么要重写equals()?

Equals和 == 的区别:

  • ==:是个运算符, 判断是否相等,基本数据类型进行判断
    也可判断两个对象相等,比较两个对象的哈希码值
  • Equals:是个Object类的方法,只能够判断对象是否相等,不能对基本数据类型进行判断
    如果没重写, 等价于a==b,但是重写之后,有自己的判断依据
  • String和StringBuffer的区别

共同点: 都是常见的字符串处理类
区别:String是个final类,属性也用final修饰,对象的值不允许发生变化。
StringBuffer对象的值允许发生变化

使用场景:

  • 1.如果想把持久类的实例放入set中(多值关联时,1对多),建议实现equals和hashcode

  • 2.想重用托管实例时,也要实现equals和hashcode

  • 3.多个字段组合作为联合主键,必须实现equals和hashcode方法

从属关系

  • equals()和hashCode()这两个方法属于Object类,
  • 而Object类是所有类的父类,因此所有的类都继承了这两个方法。

在API中:

* public boolean equals(Objectobj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;

* 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
* public int hashCode() 返回该对象的哈希码值。支持该方法是为哈希表提供一些优点。

思路分析:

  • 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,

  • 重写之后目的是为了比较两个对象的value值是否相等。

  • 特别指出,此时,利用equals比较八大包装对象(如int,float等)

  • 和String类(因为该类已重写了equals和hashcode方法)对象时,

  • 默认比较的是值,在比较其它对象都是比较的引用地址。

为什么要重写hashcode呢?

  • 利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。

  • 这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,

  • 但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,

  • 两者的hashcode却是不一样的,由此将产生了理解的不一致。

  • 将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode。

判断两个对象是否相等的规则:

  • 如果两个对象哈希值不同,那么这两个对象不相等。
  • 如果相同,则调用equals()方法判断,
  • 如果equals()方法返回true,则这两个对象相等,否则不相等。
  • 为了保证这种一致性,必须满足以下两个条件:
    (1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
    (2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
posted @ 2021-12-15 09:32  锅巴编程  阅读(356)  评论(0编辑  收藏  举报