`
aijuans
  • 浏览: 1558597 次
社区版块
存档分类
最新评论

Java中编写一个完美的equals方法

 
阅读更多

首先看下Java语言规范对equals方法的要求:

  1,自反性,对于任何非控引用x,x.equals(x)都应该返回true。

  2,对称性,对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。

  3,传递性,如果x.equals(y),y.equals(z)都返回true,那么,x.equals(z)返回true。

  4,一致性,如果x和y引用的对象没有发生变化,那么无论调用多少次x.equals(y)都返回相同的结果。

  5,对于任意非空引用x,x.equals(null)都应该返回false。  

Object类中的equals方法用于检测两个对象是否相等,而相等判断的标准则是二者是否引用同一个对象。

  下面给出编写一个完美的equals方法的原则:

  1,将equals的Object类显式参数命名为otherObject。  

  2,检测otherObject是否与this引用自同一个对象。

  3,检测otherObject是否为null,是的话返回false。

  4,检测this与otherObject是否属于同一个类,这里需要注意的情况就是当比较的两个对象不属于同一个类时,比如p.equals(e),p是一个Person,e是一个Employee,Employee继承自Person。Person拥有name,age私有域,Employee具有occupation域。

  如果相等的概念是的对象的所有域都必须相等,p.equals(e)中使用e instalceof Person返回true,但是如果e.equals(p)调用,p instanceof Employee则返回false,不满足对称性要求,所以这里需要强制采用getClass()来进行类型检测。

  如果相等的概念是由超类决定的,比如认为只要name和age相同,则Person和Employee相等,则可以使用instance进行检测,同时在超类中将该方法定义为final。

  5,将otherObject转换为this类型的变量。

  6,现在开始进行私有数据域的比较,对于基本类型如数值,字符和布尔类型使用==进行比较,对对象域使用equals进行比较,所有域都相同则返回true。

  7,使用@Override声明有助于错误检查。

  示例如下:

class Person
{
    private String name;
    private int age;

    public String getName()
    {   
        return name;
    }   
    public int getAge()
    {   
        return age;
    }   
    @Override public boolean equals(Object otherObject)
    {   
        if(this == otherObject)
            return true;
        if(otherObject == null)
            return false;        
       if(getClass() != otherObject.getClass())
            return false;
        Person other = (Person)otherObject;
        return (name.equals(other.name) && (age == other.age));
    }   
}
class Employee extends Person
{
    private String occupation;

    @Override public boolean equals(Object otherObject)
    {   
        if(this == otherObject)
            return true;
        if(otherObject == null)
            return false;
        if(getClass() != otherObject.getClass())
            return false;
        if(!super.equals(otherObject))
            return false;
        Employee other = (Employee)otherObject;
        return occupation.equals(other.occupation);
     }
}

 

3
4
分享到:
评论

相关推荐

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

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

    Java中的==和equals区别

    在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的应用。 #### `==` 运算符 `==`运算符主要用于...

    java中hashcode和equals的详解.pdf

    equals 方法是 Java 中一个非常重要的方法,因为它是 Object 类中的一个基本方法,每个对象都可以根据自己的需求来重写这个方法。 三、hashCode 和 equals 方法的关系 hashCode 和 equals 方法之间存在着紧密的...

    Java语言深入_equals

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

    java编写的计算器

    Java 编写的计算器是一个基础但实用的编程项目,它展示了如何使用Java语言来实现一个图形用户界面(GUI)程序。这个计算器可能包含了基本的数学运算,如加、减、乘、除,以及可能的一些特殊功能,如求平方根、百分比...

    java中hashcode()和equals()的详解

    首先,`equals()`方法是Object类中的一个基础方法,用于比较两个对象是否相等。默认情况下,`equals()`方法会比较对象的内存地址,也就是说,只有当两个引用指向同一个对象时,`equals()`才会返回`true`。然而,对于...

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

    而`equals()`方法是Object类中的一个成员方法,它的默认行为也是比较两个对象的引用是否相等,与`==`一致。但是,很多类(如String、Integer等)都重写了`equals()`方法,以便进行更深层次的内容比较。例如,String...

    Java equals 方法与hashcode 方法的深入解析.rar

    首先,`equals()`方法是Java Object类中的一个方法,它的默认行为是基于对象的引用进行比较,即如果两个对象引用指向同一个内存地址,那么`equals()`返回`true`,否则返回`false`。然而,当我们在自定义类中重写`...

    java编写英汉小词典

    本代码示例展示了一个基本的英汉词典添加功能的 Java 应用程序,涉及了 Java Swing 用户界面设计、事件处理机制、MySQL 数据库交互、异常处理等多个方面的知识。通过这个示例,不仅可以了解到如何构建简单的桌面应用...

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

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    java中hashcode()和equals()的详解.docx

    `hashCode()`方法是`Object`类中的一个方法,用于生成对象的哈希码。这个方法的主要作用是在散列表(如`HashSet`和`HashMap`)中快速定位元素的位置。 ##### 1. 为什么需要`hashCode()`方法? 在Java中,集合框架的...

    Java实验:方法.docx

    在这个实验中,读者需要编写一个静态方法,返回一个字符串中指定字符的个数。这个实验可以帮助读者了解Java中的字符串操作和循环语句的使用。 在该实验中,读者可以学习到以下知识点: * Java中的字符串操作,包括...

    浅谈java中==以及equals方法的用法

    equals 方法是 Java.lang.Object 类中的一个方法,用于比较两个对象的内容是否相同。equals 方法可以被重写,以满足不同的比较需求。 例如: ```java String s1 = new String("abc"); String s2 = new String("abc...

    JAVA代码编写方法

    3. **测试代码**:每个类都应该有一个`main()`方法,用于测试该类的功能。保留测试代码,以便在修改后能快速验证代码的正确性,同时它也可以作为使用类的示例。 4. **方法设计**:方法应尽可能简洁,专注于单一功能...

    java 资料 equals 与== 的区别

    Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数...在编写 Java 代码时,需要根据具体情况选择使用 == 运算符或 equals 方法。

    Java 程序显示 equals() 方法的用法.docx

    在Java编程语言中,`equals()`方法是一个非常关键的成员函数,主要用于比较两个对象是否相等。这个方法在Java的Object类中定义,并且所有的Java类都默认继承了Object类,因此所有类的对象都可以使用`equals()`方法。...

    Java_重写equals()和hashCode()

    首先,`equals()` 方法是Object类中的一个基础方法,用于比较两个对象是否相等。默认情况下,它比较的是对象的内存地址,也就是引用是否相同。但在实际开发中,我们往往需要根据对象的内容来判断它们是否相等,这时...

    java集合——Java中的equals和hashCode方法详解

    在Object类的默认实现中,`equals()` 方法比较的是两个对象的内存地址,也就是说,只有当两个对象引用指向同一个内存位置时,`equals()` 才会返回`true`。然而,大多数时候我们需要比较的是对象的内容而不是它们的...

    JAVA代码编写的建议30条

    9. **接口优于抽象类**:在Java中,一个类只能继承一个抽象类,但可以实现多个接口。因此,接口更适合多继承场景。 10. **重写equals()和hashCode()**:当重写`equals()`时,也应同时重写`hashCode()`,以保持一致...

    Java中的equals()和hashCode()契约Ja

    在Java中,`equals()`和`hashCode()`有一个基本的契约: 1. **自反性**:对于任何非空引用x,`x.equals(x)`应返回`true`。 2. **对称性**:如果x.equals(y)返回`true`,那么y.equals(x)也应返回`true`。 3. **传递...

Global site tag (gtag.js) - Google Analytics