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

Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合情合理的。然而对于多数类来说,这种判断并没有什么意义。例如,采用这种方式比较两个PrintStream对象是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。

例如,如果两个雇员对象的姓名、薪水和雇佣日期都一样,就认为它们是相等的(在实际的雇员数据库中,比较id更有意义,利用下面这个示例演示equals方法的实现机制)。

public boolean equals(Object otherObject)
    {
        Employee other = (Employee)otherObject;
        //a quick test to see if the objects are identical
        if (this == otherObject) return true;

        //must reture false if the explicit parameter is null
        if (otherObject == null) return  false;

        //if the classes don‘t match, they can‘t be equal
        if (getClass() != otherObject.getClass())
            return false;

        //test whether the fields have identical values
        return name.equals(other.name)
                && salary== other.salary
                && hireDay.equals(other.hireDay);
    }

getClass方法将返回一个对象所属的类。在检测中,只有在两个对象属于同一个类时,才有可能相等。

Java语言规范要求equals方法具有下面的特性:

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

2)对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true。

3)传递性:对于任何引用x, y 和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回              true。

4)一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。

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

以下是编写完美的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;否            则返回false。

return field1 == other.field1 && Object.equals(field2, other,field2)&&...

如果在子类中重新定义equals,就要在其中包含调用super.equals(other).

原文地址:https://www.cnblogs.com/anmaozhang/p/8448255.html

时间: 2025-01-20 01:03:39

Java判断两个对象是否相等的规则的相关文章

Java 判断两个对象是否相等

一.使用 == 与 equals == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() : 它的作用也是判断两个对象是否相等.但它一般有两种使用情况: 情况1:类没有覆盖equals()方法.则通过equals()比较该类的两个对象时,等价于通过"=="比较这两个对象. 情况2:类覆盖了equals()方法.一般,我们都覆盖equals()方法来两个对象的内容相等:若它们的

Java中如何判断两个对象是否相等(Java equals and ==)

原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解equals和hashCode方法: 1.equals的作用及与==的区别. 2.hashcode的作用及与equals的关系. 1.equals的作用及与==的区别. equals被用来判断两个对象是否相等. equals通常用来比较两个对象的内容是否相等,==用来比较两个对象的地址是否相等. e

【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更

java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; import java.lang.reflect.Field; import java.util.*; /** * @ClassName Test * @Description 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 * @Author sxd

java比较两个对象是否相等的方法

java比较两个对象是否相等直接使用equals方法进行判断肯定是不会相同的. 例如: Person  person1  =new Person("张三"); Person  person2  =new Person("张三"); boolean  falg = person1.equals(person1); falg 的值是false; 如果要判断两个对象相同就需要重写父类的equals方法和hashCode方法: 这时再次测试时falg的值就是true.

java比较两个对象是否相等?

1.判断两个对象是否是同一个引用对象则用==,"=="比的是地址.因为如果地址相同,则就是同一个对象(java中如果两对象(obj1,obj2)相等,那么在修改obj2的时候,obj1的值也会改变.其实相当于内存中只有一个对象,而obj1和obj2连个变量都指向同一个对象.)2.obj1.equals(Object obj2),用来判断两个对象是否相等.(如果两个变量引用的是两个不同地址的对象,即使对象的内部参数都是一样的,系统也会认为是不同的两个对象,所以要用equals)

java 判断两个时间相差的天数!

package com.datedaycha;     import java.text.SimpleDateFormat;     import java.util.Calendar;     import java.util.Date;     import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;     /*      * java 判断两个时间相差的天数     1.实现目标     输入:两

Java判断两个路径对应的文件是否相同

今天遇到一个bug,查了一个小时才发现是文件路径比较出了问题: 比如有两个路径:D:\dir\..\a.txt和D:\a.txt.这两个路径写法虽然不同,但是很容易知道这两个路径指向的是同一个文件.如果我们使用Java的File去判断两个路径是否相同,判断如下: File f1 = new File("D:\\dir\\..\\a.txt"); File f2 = new File("D:\\a.txt"); System.out.println(f1.getAbs

判断两个对象内容相等

我们知道,如果两个对象即使内容,javascript也会判断它们不相等.但是有时候,我们仅仅需要判断两个对象的内容是否相等.那么我们应该如何做到且考虑周全呢?比如说0和-0,null和undefined,是不相等的,NaN和NaN默认是不相等的.我写了一个isEqual方法,考虑到了诸多方面,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>&l

c#如何判断两个对象是否相等

在c#中判断对象相等,这是对引用类型进行判断,而不是对值类型,如果是对字符串,或者是数值进行判断相等只需要用==运算符就可以了. 对两个对象用==运算符,只能判断他们两个在内存中的地址是否一样的.  1.对一个类只实例化一次 向那些赋值来赋值去的引用如果没有new实例化一个对象的话,那么这些赋值来,赋值去的对象指向的都是同一地址.举一个例子有一个类People People p1=new People(); People p2=p1; People p3; p3=p2; 像这样对象p1 ,p2,