`

第8条:覆盖equals时请遵守通用约定

    博客分类:
  • java
阅读更多
    本来应该是写第7条的,但是发现我对第7条讲的东西不是很理解,所以就暂时先跳过,以后可能会遇到这样的章节也会跳过,写错误导别人罪过就大了。
覆盖equal方法看起来似乎很简单,但有很多覆盖方式会导致错误并导致很严重的后果。避免这类问题最简单的方法当然就是不覆盖equal方法。那么,我们要知道在哪些情况下就不需要覆盖equal方法呢?
    只要满足下面任何一条,就可以,
      1、类的每个实例本质上都是唯一的。对于代表活动实体而不是值的类,比如:Thread.
      2、不关心类是否提供了“逻辑相等”的测试功能。比如:java.util.Random。
      3、超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的。例如:大多数  的Set实现都是从AbstractSet继承的。还有List的实现,Map的实现。
     4、类是私有的或是包级私有的,可以确定它的equals方法永运不会被调用。
     5、用实例受控来确保“每个值至多只存在一个对象”的类,比如枚举类型。这样的类逻辑相同与对象相同是一回事。

    那么,什么时候应该覆盖Object.equals呢?如果类有自己特有的“逻辑相等”,并且超类没有覆盖equals来实现期望的行为,这时需要覆盖equals方法。

    覆盖equals方法必须遵守的约定:
        1、自反性。对于任何非null的引用值x,x.equals(x)  必须返回true。
        2、对称性。对于任何非null的引用值x和y,当且仅当y.equals(x) ==true,必须有x.equals(y) == true。
        3、传递性。对于任何非null的引用值x、y和z。如果y.equals(x) ==true,且y.equals(z) ==true,那么必须有z.equals(x) ==true。
        4、对于任何非null的引用值x,必须有x.equals(null)==false;

    书中给出几条实现高质量equals方法的诀窍:
        1、使用==操作符检查“参数是否为这个对象的引用”,如果是,返回true。
        2、使用instanceof操作符检查“参数是否为正确的类型”。如果是,返回true。一般所谓的正确的类型是指equals方法所在的那个类。有些时候是指该类所实现的某个接口。
        3、把参数转换成正确的类型。
        4、对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配。如果这些测试全部成功,返回true,否则返回false。
        5、当写完equals方法后,应该问自己三个问题:它是否是对称的、传递的、一致的?这些是要编写单元测试来验证的。

    最后还有几点告诫:
        覆盖equals方法时总要覆盖hashCode
        不要企图让equals方法过于只能。
        不要将equals声明中的Object对象替换为其它的类型。
分享到:
评论

相关推荐

    winform 重写Equals源码

    5. **相等性约定**:为了保持一致性,通常还需要重写`GetHashCode`方法,以便当两个对象相等时,它们的哈希码也相等。此外,`Equals`和`GetHashCode`应满足以下契约: - 如果`a.Equals(b)`为`true`,那么`a....

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    Java 覆盖equals时总要覆盖hashcode

    在Java编程中,当我们重写`equals()`方法时,通常也需要重写`hashCode()`方法。这是因为`equals()`和`hashCode()`方法在Java集合框架中扮演着重要的角色,特别是在使用`HashMap`、`HashSet`等基于哈希表的集合类时。...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。

    重写equals方法

    "equals 方法重写详解" 在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用...

    Java核心技术(1).pdf

    - **项03:覆盖equals时请遵守通用约定**:正确的equals方法实现对于确保对象一致性至关重要。 #### 代码设计原则 - **项04:始终覆盖hashCode**:当重写了equals方法时,必须同时重写hashCode方法以保持一致性。 ...

    set接口经常用的hashCode和equals方法详解

    为了实现元素的唯一性,`Set`接口要求覆盖`equals`方法,使其能够根据元素的实际内容来进行比较。 - **内容比较**: 在`Set`接口的不同实现中,通常会根据元素的属性或内容来进行比较。例如,在`String`类中,`...

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    Java中equals方法隐藏的陷阱

    ### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见...

    java中equals()函数的用法 equals和==的区别

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    equals(Object) 与 == 的区别

    "equals(Object) 与 == 的...例如,在比较两个字符串是否相同时,我们应该使用 equals(Object) 方法,而不是 == 运算符。 equals(Object) 与 == 的区别是非常重要的,我们需要正确地理解和使用它们,以避免编程错误。

    java_equals用法

    java_equals用法,用来熟悉重写equals方法的

    java中hashcode()和equals()方法详解

    - 为了避免哈希冲突带来的性能问题,在覆盖`equals()`方法的同时,通常也需要覆盖`hashCode()`方法。 #### 实现示例 以下是一个简单的类`Person`,展示了如何正确覆盖`equals()`和`hashCode()`方法: ```java ...

    equals问题经典

    但当我们调用`s1.equals(s2)`时,由于`String`类已经重写了`equals()`方法,比较的是字符串的内容,所以`s1.equals(s2)`的结果是`true`,因为它们的内容("abc")相同。而`s1 == s2`比较的是对象的引用,两者指向...

    重写toString和equals方法

    Java 对象的toString和equals方法重写 在 Java 中,每个对象都继承自 Object 类,而 Object 类中定义了两个重要的方法:toString() 和 equals()。这两个方法都是非常重要的,它们分别用于对象的字符串表示和对象...

    Java语言深入_equals

    《Java语言深入_Equals》 Java中的`equals`方法是一个至关重要的方法,用于比较两个对象是否“相等”。在Java API规范中,`equals`方法必须遵循以下五个基本原则: 1. 对于任何引用类型,`o.equals(o)`总是返回`...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    ==和equals的区别

    Java 中的 == 和 equals 方法的区别 在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种...

    equals方法的重写.docx

    ### equals方法重写知识点解析 #### 一、equals方法简介 `equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容...

Global site tag (gtag.js) - Google Analytics