当前位置: 首页>>代码示例>>用法及示例精选>>正文


Java Overriding equals用法及代码示例

考虑以下Java程序:

class Complex { 
    private double re, im;     
      
    public Complex(double re, double im) { 
        this.re = re; 
        this.im = im; 
    } 
} 
  
// Driver class to test the Complex class 
public class Main { 
    public static void main(String[] args) { 
        Complex c1 = new Complex(10, 15); 
        Complex c2 = new Complex(10, 15); 
        if (c1 == c2) { 
            System.out.println("Equal "); 
        } else { 
            System.out.println("Not Equal "); 
        } 
    } 
}

输出:

Not Equal 

打印“Not Equal”的原因很简单:比较c1和c2时,将检查c1和c2是否都引用相同的对象(对象变量在Java中始终是引用)。 c1和c2引用两个不同的对象,因此值(c1 == c2)为假。如果我们像下面创建另一个引用说c3,则(c1 == c3)将为true。


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

那么,我们如何检查对象内部值的相等性呢? Java中的所有类都直接或间接地从Object类继承(请参见此点1)。 Object类具有一些基本方法,例如clone(),toString(),equals()等。我们可以在类中重写equals方法,以检查两个对象是否具有相同的数据。

class Complex { 
  
    private double re, im; 
  
    public Complex(double re, double im) { 
        this.re = re; 
        this.im = im; 
    } 
  
    // Overriding equals() to compare two Complex objects 
    @Override
    public boolean equals(Object o) { 
  
        // If the object is compared with itself then return true   
        if (o == this) { 
            return true; 
        } 
  
        /* Check if o is an instance of Complex or not 
          "null instanceof [type]" also returns false */
        if (!(o instanceof Complex)) { 
            return false; 
        } 
          
        // typecast o to Complex so that we can compare data members  
        Complex c = (Complex) o; 
          
        // Compare the data members and return accordingly  
        return Double.compare(re, c.re) == 0
                && Double.compare(im, c.im) == 0; 
    } 
} 
  
// Driver class to test the Complex class 
public class Main { 
  
    public static void main(String[] args) { 
        Complex c1 = new Complex(10, 15); 
        Complex c2 = new Complex(10, 15); 
        if (c1.equals(c2)) { 
            System.out.println("Equal "); 
        } else { 
            System.out.println("Not Equal "); 
        } 
    } 
}

输出:

Equal 

附带说明,当我们覆盖equals()时,建议也覆盖hashCode()方法。如果我们不这样做,则相等的对象可能会获得不同的hash-values;基于哈希的集合(包括HashMap,HashSet和Hashtable)不能正常工作(有关更多详细信息,请参见此内容)。我们将在另一篇文章中介绍有关hashCode()的更多信息。

参考文献:
有效的Java第二版



相关用法

注:本文由纯净天空筛选整理自 Overriding equals method in Java。非经特殊声明,原始代码版权归原作者所有,本译文的传播和使用请遵循“署名-相同方式共享 4.0 国际 (CC BY-SA 4.0)”协议。