`
kangfuq
  • 浏览: 12145 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java完美重写equals()方法的建议

阅读更多
下面给出编写一个完美的equals方法的建议:

1)显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量

2)检测this与otherObject是否引用同一个对象 :if(this == otherObject) return true;

3) 检测otherObject是否为null ,如果为null,返回false.if(otherObject == null) return false;

4) 比较this与otherObject是否属于同一个类
如果equals的语义在每个子类中有所改变,就使用getClass检测 :if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测 :if(!(otherObject instanceof ClassName)) return false;

5) 将otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;

6) 现在开始对所有需要比较的域进行比较 。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则就返回flase.

如果在子类中重新定义equals,就要在其中包含调用super.equals(other)
——参考《Java2核心技术 第一卷:基础知识》
当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明 相等对象必须具有相等的哈希码 。
【改写equals方法时,总是要改写hashCode方法】
1
2
分享到:
评论
4 楼 黑屏 2012-05-02  
kangfuq 写道
黑屏 写道
楼主,我不是很明白你所说的关于“如果equals的语义在每个子类中有所改变,就使用getClass检测”,难道instanceof无法通用?

简单的说就是

1、如果你编写的这个类可能会有子类,并且子类的相等性由子类自己判断(即重写父类的equals方法),那么就要用getClass;
    如果使用instance会违反equals方法的对称性原则:假设雇员(e)是父类实例,经理(m)是子类实例,他们逻辑上是不相等的,却可能出现 e.equals(m)为true,m.equals(e)为false;

2、如果你编写的这个类没有子类或子类不会重写equals方法(这时应该把equals方法声明为final),那么就是用instance; 
    这时使用getClass检测会出现问题:比如A有两个子类B和C,B类的实例b与C类的实例c逻辑上是相等的,但是b.equals(c)一直都返回false;

我明白了。谢谢了。
3 楼 kangfuq 2012-05-02  
黑屏 写道
楼主,我不是很明白你所说的关于“如果equals的语义在每个子类中有所改变,就使用getClass检测”,难道instanceof无法通用?

简单的说就是

1、如果你编写的这个类可能会有子类,并且子类的相等性由子类自己判断(即重写父类的equals方法),那么就要用getClass;
    如果使用instance会违反equals方法的对称性原则:假设雇员(e)是父类实例,经理(m)是子类实例,他们逻辑上是不相等的,却可能出现 e.equals(m)为true,m.equals(e)为false;

2、如果你编写的这个类没有子类或子类不会重写equals方法(这时应该把equals方法声明为final),那么就是用instance; 
    这时使用getClass检测会出现问题:比如A有两个子类B和C,B类的实例b与C类的实例c逻辑上是相等的,但是b.equals(c)一直都返回false;
2 楼 freezingsky 2012-05-02  
一般用netbeans直接生成对应的方法。
1 楼 黑屏 2012-05-02  
楼主,我不是很明白你所说的关于“如果equals的语义在每个子类中有所改变,就使用getClass检测”,难道instanceof无法通用?

相关推荐

    重写equals方法

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

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    Java_重写equals()和hashCode()

    总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的逻辑以及使用哈希表的数据结构的效率。通过遵循上述原则和最佳实践,我们可以确保对象的比较行为...

    浅谈java 重写equals方法的种种坑

    关于 Java 中重写 equals 方法的种种坑 Java 中的 equals 方法是一种用于比较对象是否相等的方法,它是 Object 类中的一个方法。然而,重写 equals 方法并不是一件简单的事情,因为它需要遵守一些约定,否则可能会...

    equals方法的重写.docx

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

    重写toString和equals方法

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

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    总的来说,理解并正确地重写 `equals()` 和 `hashCode()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

    Java中equals方法隐藏的陷阱

    ### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`...通过遵循上述建议,可以有效地避免`equals`方法中的常见陷阱,并提高程序的质量。同时,了解这些陷阱背后的原理也有助于加深对Java语言特性的理解。

    方法重写equals和多态

    在Java编程语言中,"方法重写equals"和"多态"是两个核心概念,尤其对于面向对象的设计和实现至关重要。下面将详细解释这两个概念及其相互关系。 **方法重写equals()** 在Java中,`equals()`方法是Object类的一个...

    2.javaequals()方法.zip

    2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....

    重写Java中的equals方法介绍

    Java中的equals方法重写介绍 Java中的equals方法是一个非常重要的方法,它用于判断两个对象是否相等。在Java中,所有的对象都继承自Object类,而Object类中有一个equals方法,该方法用于判断两个对象是否相等。但是...

    java_equals用法

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

    为什么在重写 equals方法的同时必须重写 hashcode方法

    在 Java 中,`equals` 和 `hashCode` 方法是 Object 类中的两个重要方法,它们用于比较对象的相等性。默认情况下,`equals` 方法比较的是两个对象的引用,即是否指向内存中的同一个位置,而 `hashCode` 方法则返回...

    winform 重写Equals源码

    在某些情况下,尤其是自定义控件或者业务实体类的设计中,我们可能需要重写`Equals`方法来实现特定的比较逻辑。下面我们将深入探讨WinForm中重写`Equals`方法的相关知识点。 首先,`Equals`方法是`Object`类中的一...

    java中为何重写equals时必须重写hashCode方法详解

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象身份验证和哈希表操作的关键组成部分。当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证...

    java中的==和equals()方法1

    在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...

Global site tag (gtag.js) - Google Analytics