2011-10-05 107 views
5

這是我的Coor類的equals類的實現,它只包含2個x和y。這是實施這種方法的適當方式嗎?在java中實現equals方法

public boolean equals(Object obj) { 
     if (obj == null || obj.getClass() != this.getClass()) { 
      return false; 
     } 
     Coor temp = (Coor) obj; 
     if (temp.x == this.x && temp.y == this.y) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
+2

是的。如果所有的字段都是相同的,並且這是您「平等」的意思,那麼您已經正確地制定了方法。如果你正在比較繼承自當前('this')類的東西,那麼這將不起作用,但如果它們是可行的,它將起作用。 – bdares

+1

不要忘記重寫散列碼函數,如果你希望在集合中使用它(即使在屏幕後面) –

回答

7

你可以添加一個支票反思平等(等於個體經營):

public boolean equals(Object obj) { 

    // Reflexive equality: did I get passed myself? 
    if(this == obj){ 
     return true; 
    } 

    if (obj == null || obj.getClass() != this.getClass()) { 
     return false; 
    } 

    Coor temp = (Coor) obj; 
    return temp.x == this.x && temp.y == this.y; 
} 
+0

你能解釋一下「this == obj」實際上是在比較什麼?它只是檢查它是否是同一個對象? – user979490

+1

對象的內存位置。 –

+1

它檢查2個對象引用('this'和'obj')以查看它們是否指向相同的內存位置。如果他們這樣做,他們是同一個對象。 – Pat

5

是的,它會的。

另外一定要覆蓋你的hashCode()方法 - 絕對不要重寫一個而不做另一個,它會混淆你的集合。

你的情況下,可以使用一個散列結果,其中它只是轉移的整數32位中的一個,並把它添加到其他創造一個完全獨特的長(一個完美的哈希在這種情況下功能 - 無碰撞)

+0

因爲我不知道haseCode()是什麼或它是什麼但是,謝謝你的建議 – user979490

1

檢查了這一點:

http://www.javapractices.com/topic/TopicAction.do?Id=17

如果物品爲太多細節,那麼短它是: 你的實施是正確的,但你應該記住一些其他的事情:

  1. 你還必須實現hashCode。

  2. equals將不再對對象的身份進行commpare。聽起來不像是你的問題。

  3. 您可以將@Override註釋添加到您的equals方法中。

0

這裏有一個更簡單的方法:

public boolean equals(Object other) { 
    return other instanceof Coor 
     && ((Coor) other).x == x 
     && ((Coor) other).y == y 
} 
0

我相信這會工作,快速瀏覽。我這樣說是因爲:

  1. 它處理空/不正確的類型。
  2. 執行x.equals(y)將產生與y.equals(x)相同的結果。
  3. 執行x.equals(x)將返回true。
  4. 執行x.equals(y)== true並且y.equals(z)== true意味着x。等於(z)== true

雖然這個問題肯定有很多次被問過。看到這裏:Overriding equals and hashCode in Java。一本名爲有效的Java的書也非常詳細地討論了這個話題,並且特定章節被鏈接到那裏。

0

關於如何覆蓋equals和hashCode,只有一個來源可以閱讀:Joshua Bloch的「Effective Java」的chapter 3

如果你有一個好的IDE,比如IntelliJ,它會爲你生成equals和hashCode。