2013-07-29 59 views
-2

我創建了類A。然後我創建了兩個類A的對象。對象的等於方法

A a1=new A(5); 
A a2=new A(5); 

然後,如果我嘗試使用equals方法來比較的對象,其返回false

if (a1.equals(a2)) // ->false 

在相同的情況下,如果我使用的包裝類像

Integer i1=new Integer(5); 
Integer i2=new Interger(5); 

if (i1.equals(i2)) // ->returns true 

爲什麼?誰能解釋一下?

回答

2

對於您需要重寫equals()方法A類 如果不重寫它會使用Object類中的方法equals方法,檢查引用是否varaibles指向同一個對象或沒有。

對於Integer類,equals()方法已被覆蓋,並檢查該值。

而且,只要你將覆蓋equals(),覆蓋hashcode()

public class A { 

    private int number; 

    A(int number){ 
     this.number = number; 
    } 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + number; 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     A other = (A) obj; 
     if (number != other.number) 
      return false; 
     return true; 
    } 

    public static void main(String[] args) { 
     A a1 = new A(5); 
     A a2 = new A(5); 

     System.out.println(a1.equals(a2)); 
    } 


} 

此打印出true

爲什麼?誰能解釋一下?

隨着Integer類,該方法equals()已經重寫的並且其檢查的值。

Integer#equals()

一個很好的教程,幫助理解equals方法的意義在於提供了theJavaGeek

6

你必須重寫equals()方法在A類。缺省情況下它使用從Object類繼承的實施方式中,即Object#equals()其比較參考,即,如果兩個對象是駐留在堆中同一個對象,它返回true否則false。如果你需要檢查你的對象的內容平等覆蓋類的equals()方法。

注意:通常是一個很好的做法,覆蓋hashCode(),而overidding equals()

我提供了一個簡單的實現:

class A { 
private int value ; 
A(int value) { 
    this.value = value; 
} 
@Override 
public boolean equals(Object obj) { 
    if(obj==null || !(obj instanceof A)){ 
     return false; 
    } 
    return this.value==((A)obj).value; 
} 
@Override 
public int hashCode() { 
    return this.value; 
} 
} 

Integer類已經重寫此方法,Integer#equals()

將此對象與指定的對象進行比較。當且僅當參數不是null,而是一個Integer對象包含相同int值作爲此對象的結果是正確的。

推薦閱讀:

  1. Overriding equals and hashCode in Java
  2. Joshua Bloch - always override hashCode when you override equals
+2

我建議還注意到,忽略equals時,重寫hashCode以確保兩個相等的對象具有相同的哈希碼是非常重要的。 –

2

當你有這樣的,

Integer i1=new Integer(5); 
Integer i2=new Interger(5); 
if(i1.equals(i2)) 

它將返回true

因爲Integer類重寫equals方法來比較值而不是比較引用。

對於包裝類Integer,文字從-128到127在同一個池中使用。

,你會發現從HERE, see this for answer採取了這種有趣的:

Integer i1 = 127; 
    Integer i2 = 127; 

    if(i1==i2){ 
     System.out.println("true"); //prints true 
    }else{ 
     System.out.println("false"); 
    } 

    Integer i3 = 128; 
    Integer i4 = 128; 

    if(i3==i4){ 
     System.out.println("true"); 
    }else{ 
     System.out.println("false"); //prints false 
    } 
0

你應該重寫equals()類方法的

例如

class A{ 
    int b; 
    A(int b){ 
     this.b = b; 
    } 
    @Override 
    public boolean equals(A a){ 
     return this.b ===a.b;  
    } 

} 
0

那當你調用equals()上,因爲它調用的A實例等於Object類,其中比較r推論

所以如果你會做什麼:

instance1.equals(instance1); //will return true 

要提供自定義等於實現你將不得不覆蓋equals方法在你的類:

class A{ 


    @Override 
    public boolean equals(Object obj){ 
     return equality; 
    } 

}