2010-02-23 146 views
6

如何覆蓋對象類中的equals方法?Java重寫Object equals()方法

即我有

class Person{ 

//need to override here 
public boolean equals (Object obj){ 

} 

我想將參數轉換OBJ一種類型的人,但如果我這樣做(人)目標文件將無法正常工作。

+1

注意,你必須要小心,如果你有一個非final類。通常,您應該使用'obj.getClass()== Person'而不是'instanceof Person'來檢查運行時類。儘管可以編寫一個讓派生類型相同的合約(如'java.util.List')。如果你重寫'equals',你也應該重寫'hashCode',但這可能會提前一點。 – 2010-02-23 05:33:48

回答

8

你可以施放它裏面的方法,只要確保是使用的

if(obj instanceof Person) 
{ 
    Person otherPerson = (Person) obj; 
    //Rest of the code to check equality 
} 
else 
{ 
//return false maybe 
} 
+0

而我想到Person otherPerson =(Person)obj; 謝謝 – user69514 2010-02-23 05:14:37

10

它其實比你想象的更復雜的情況下正確的類型。使用Eclipse(或任何您使用的IDE)自動生成equals方法;你會看到它包含一些檢查並在進行比較之前進行強制轉換。

而且在這裏看到:http://www.javapractices.com/topic/TopicAction.do?Id=17

8
@Override 
public boolean equals(Object o) 
{ 
    if (o instanceof Person) 
    { 
     Person c = (Person) o; 
     if (this.FIELD.equals(c.FIELD)) //whatever here 
     return true; 
    } 
    return false; 
} 
+3

很多我不喜歡那個代碼,但是我被迫爲@ @ Override來+1。 – 2010-02-23 05:34:42

5

Regarding Object Comparison看看。

請注意,如果您覆蓋equals()必須也覆蓋hashCode()。 equals/hashCode約定是,如果兩個對象相等,它們必須具有相同的哈希碼。

3

如果您打算創建一個Person的子類,使用類似

如果(OBJ!= NULL & & obj.getClass()== Person.class)

,而不是的instanceof

+0

爲什麼會使用getClass()而不是instanceof? (只是好奇。) – Tom 2010-02-23 05:27:59

+2

例如如果員工延長人員;員工有其他字段,如ID等 您可能會得到一個誤報使用person.equals(員工) – saugata 2010-02-23 11:05:11

+1

這不是你需要擔心的誤報,而是**違反反身性**。不管你使用什麼,你基本上可以保證'新的Employee()。​​equals(new Person())'將會是false(Person不是Employee的一個實例)。如果反轉參數,結果**必須相同,所以Person **不能等於它自己的子類(除非你在子類的equals()方法中做了一些非常時髦的事情)。 – 2010-02-24 12:28:01

2

使用getClass()而不是instanceof的唯一原因是,如果想要聲明被比較的兩個引用指向完全相同類的對象而不是實現相同基類的對象。

假設我們有一個EmployeeËManager(延伸Employee)。

m instanceof Employee會產生錯誤,m.getClass() == Employee.class會返回false。

在某些情況下,後者可能是首選,但很少在比較equals()hashCode()方法中的實例時。

0

還有一點可能是很好的瞭解,你重寫後equals()方法(也hashcode())方法,你可以比較同一類的兩個對象,如如下:

Person p1 = new Person(); 
Person p2 = new Person(); 

.... 

if (p1.equals(p2)) 

{ 
    // --- Two Persons are equal, w.r.t the fields you specified in equals method --- 

} 
0

我知道這是回答,但在我的旅行我發現這是最有效的方式來覆蓋對象的比較,以確保它發生在全球範圍相同:

@Override 
public boolean equals(Object o) { 
    return o instanceof Person && this.getSomeMagicalField().equals(((Person) o).getSomeMagicalField()); 
} 

,如果你不COMPAR荷蘭國際集團字符串:

@Override 
public boolean equals(Object o) { 
    return o instanceof Person && this.getSomeMagicalField() == (Person) o).getSomeMagicalField(); 
} 
0

我更喜歡簡單的,空安全(R)Objects.equals任何字段類型:

@Override 
public boolean equals(Object o) { 
    if (o instanceof Person) { 
     Person p = (Person) o; 
     return Objects.equals(p.FIELD, this.FIELD); 
    } 
    return false; 
}