重写 Java 语言中的相等方法 equals()

yufei       6 年, 1 月 前       862

你知道下面的 Java 代码输出结果是什么吗?

JavaTester.java

public class JavaTester
{ 
    private double re, im;     

    public JavaTester(double re, double im) { 
        this.re = re; 
        this.im = im; 
    } 

    public static void main(String[] args)
    { 
        JavaTester c1 = new JavaTester(10, 15); 
        JavaTester c2 = new JavaTester(10, 15); 
        if (c1 == c2) { 
            System.out.println("Equal"); 
        } else { 
            System.out.println("Not Equal"); 
        } 
    } 
}

结果是显而易见的。非常简单,就是 Not Equal

上面这段代码,编译运行的结果如下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
Not Equal

但你知道为什么吗?

答案也是很简单的:当我们比较 c1c2 时,Java 只是简单的检查 c1c2 是否都指向同一个对象。

上面的代码中,c1c2 指向的是两个不同的对象,因此值 c1 == c2 的比较为 false 。但如果我们创建了另外一个引用,比如下面代码中的 c3 ,那么 c1 == c3 的结果将是 true

Complex c3 = c1;  // (c3 == c1) will be true 

那么,对于相等操作,我们要如何检查对象内部的值是否相等,而不是去比较它们是否指向同一个对象呢?

我们知道,Java 中的对象都是直接或间接的继承自 java.lang.Object 类 。而 Object 类 则包含了一些基本的方法,比如 clone()toString()equals() 等等。其中,equals() 方法就是用来比较两个对象是是否相等的操作的方法。

因此,我们可以通过重写 equals() 方法来检查两个对象是否具有相同的数据。就像下面这个范例中所演示的那样

public class JavaTester
{ 
    private double re, im;     

    public JavaTester(double re, double im) { 
        this.re = re; 
        this.im = im; 
    } 

    // 重写 equals() 方法来比较两个对象
    @Override
    public boolean equals(Object o) { 

        // 如果 o 对象指向了自己,则不用比较直接返回 true   
        if (o == this) { 
            return true; 
        } 

        // 如果 o 对象不是当前类的实例,那么直接返回 false 
        if (!(o instanceof JavaTester)) { 
            return false; 
        } 

        // 把 o 对象转换为当前类,这样我们才能比较
        JavaTester c = (JavaTester) o; 

        // 比较两个实例的数据 
        return Double.compare(re, c.re) == 0
                && Double.compare(im, c.im) == 0; 
    }

    public static void main(String[] args)
    { 
        JavaTester c1 = new JavaTester(10, 15); 
        JavaTester c2 = new JavaTester(10, 15); 
        if (c1.equals(c2)) { 
            System.out.println("Equal "); 
        } else { 
            System.out.println("Not Equal "); 
        } 
    } 
}

编译运行的结果如下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
Equal 

建议: 当我们重写 equals() 方法时,最好同时重写 hashCode() 方法。如果我们不这样做,则相等的对象可能会获得不同的哈希值,从而导致基于 hash 值的集合,比如 HashMap,HashSet 和 Hashtable 无法正常工作。

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.