2009-07-09 150 views
0

我想比較迭代器中x的2個實例的值。Java:比較對象值

x是一個包含其自己的數據成員的引用類型。我試圖比較x的一個實例與另一個實例,以確定每個實例內部的值是否相同。

如果(x.equals(X))

保持評估爲真時實際上x的每個實例的值是不同的。

乾杯。

+0

你所說的 'X在每種情況是不同的' 是什麼意思?你能提供更具體的代碼嗎? – notnoop 2009-07-09 01:46:18

+0

x.equals(x)總是會是真的....所以x == x 你是什麼意思? – hhafez 2009-07-09 01:47:18

回答

8

假設你的代碼並沒有真正像這樣

X x = new X(); 
if(x.equals(x)) 

而更像

X x = new X(); 
X y = new X(); 

if(x.equals(y)) { } 

並且您正在x.equals(y)得到錯誤的值,那麼你平等的實現是壞了。

轉到您的Class X並檢查等效是如何實施的。如果它沒有在X中實現,請在超級類中檢查。

1

這是一個很難回答的細節問題。它們必須是對象,而不是具有.equals方法的基元。那麼等於方法是否被導致錯誤比較的方式被覆蓋?那將是我會考慮的地方。

0

這聽起來像你是比較引用而不是數據。

編輯: 從對象的API文檔: 「的等於Object類方法實現對象上差別可能性最大的等價關係;即,對於任何非空引用值x和y,此方法返回true當且僅當x和y表示相同的對象(x == y的值爲true)。「

eg如果'X'或它的父類不重寫equals,那麼當你調用equals時,它將比較引用,如果它們是相同的對象將永遠是平等的。

通過它的聲音,你需要重寫類'X'中的equals方法,但是再說一次,你所說的似乎表明它們是相同的參考?

0

Object類中的equals方法執行實例等同操作。但是,Object的子類通常會覆蓋此方法以執行相對等於操作,其中目標對象內的值將根據所討論的對象的值進行測試。在你的情況下,你很可能使用覆蓋equals方法的子類Object。這將是很好的知道如何實現您的類Xequals方法。

0

我打算假設你的兩個X對象實際上是不同的對象,而不是錯誤地是同一個對象。在這種情況下,問題在於該類的equals()實現。檢查您的類及其超類的equals()實現,並確保其實際比較智能。如有必要,請自己寫。

class Square 
{ 
    public int length; 

    public boolean equals(Square s) 
    { 
     return this.length == s.length; 
    } 
} 
0

如果您決定重寫的equals(),也覆蓋hashCode()方法