2017-10-14 102 views
0

因此,很長一段時間以來,我認爲使用equals()來比較對象,它使用hashcode(),這意味着如果2個對象具有相同的哈希代碼,則返回true。如何在java中比較對象?

的equals()方法從源代碼方法:

@see java.lang.System #identityHashCode 
public boolean equals(Object obj) { 
     return (this == obj); 
    } 

所以我創建這樣的:

public static void main(String[] args) { 
     Dog rover = new Dog("Rover"); 
     Dog german = new Dog("Rover2"); 

     System.out.println("German: " + german + "\tRover: " + rover); 
     System.out.println(german.equals(rover)); 


    } 

此外,我重寫哈希碼()到:

@Override 
    public final boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
    } 

    @Override 
    public int hashCode() { 
     //The main point of 0 is to check how equals actually work 
     return 0; 
    } 

現在即使兩個對象都是@ Dog0,print語句也會打印false。 奇怪,爲什麼 控制檯:

German: [email protected] Rover: [email protected] 
false 

回答

1

您使用equals爲「別名」爲this == obj比較這是錯誤,這就是爲什麼它不工作。

對象有equals方法,因爲如果this == obj實際上是相同的對象(內存中的相同引用),則它只返回true。

您需要做的是手動比較equals方法中的屬性,並且只有匹配時才返回true。

+0

所以當處理對象時,它會查找內存地址而不是哈希碼來返回true? – Bishop

+0

是的,確切地說。它看起來是否「指向」同一個對象,並且與散列碼無關。 – Aenadon

1

的原因,他們不是「平等」無關的散列碼。

的原因它們不相等是此條件:

this == obj 

返回true僅當obj相同對象作爲this
您有2個對象,因此不能爲真。

此外,從源代碼中可以看到,調用equals()不會調用hashCode()。 AFAIK,有沒有的實現(無論如何在JDK中),其中equals()調用hashCode()

+0

也許會出現混淆,因爲Object的'toString()'是如何實現的。它打印出:'getClass()。getName()+'@'+ Integer.toHexString(hashCode())''''和'bject'的默認'hashCode()'實現將對象的**內部地址**轉換爲整數。這個內部地址也是'=='運算符正在使用的內容,因此造成混淆。 –

+0

也許值得將它添加到您的答案:equals()和hashCode()通過契約綁定在一起:如果o1.equals(o2)返回true,那麼o1.hashCode()== o2.hashCode也必須爲true。相反的情況並非總是如此:兩個對象可以具有相同的哈希代碼,但equals可能會返回false(即非常大的字符串)。 – Heri