簡體   English   中英

equals方法為兩個對象返回true哈希方法為兩個對象返回不同的值是

[英]equals method returns true for two objects hash method returns different value for two objects is that OK

我有一個實施的特殊要求。

我需要在集合中存儲幾個對象。

讓我們以這個簡單的類為例-

class Name { 
    String first; 
    String last; 
    String middle;
}

我的業務規則是,如果第一個,最后一個和中間字段都相等,或者如果第一個和最后一個字段相等,並且其中一個(或兩個)對象的中間字段為空,則兩個Name對象被視為相等。

因此,在為我的Name類實現hash和equals方法時,我可能會有一個用例,其中equals對兩個對象返回true,但兩個對象的哈希返回不同的值(因為一個對象的中間值和另一個對象的值)中間為null)。

我使用的實際Set實現不能是HashSet,因為HashSet使用哈希方法來確定是否將對象添加到Set中。 在我的示例中,hash方法將為這兩個對象name1(first = Bruce,last = Phillips,middle = Allen)和name2(first = Bruce,last = Phillips,middle = null)返回不同的值,即使我的equals方法將對兩個對象返回true。

我的計划是使用TreeSet並使我的Name類實現可比。 我並不真正在意TreeSet中Name類對象的順序,但是通過使用TreeSet並實現可比較的compareTo方法,我可以在類Name中使用equals方法(該方法檢查對象之一是否中間字段為null)來確定如果兩個對象相等。

這種解決我的要求的方法有什么缺點?

感謝您的幫助。

布魯斯

從Javadocs:

類Object的equals方法在對象上實現了最有區別的對等關系。 也就是說,對於任何非空參考值x和y,當且僅當x和y引用同一個對象(x == y的值為true)時,此方法才返回true。

請注意,通常有必要在重寫此方法時重寫hashCode方法,以維護hashCode方法的常規協定,該協定規定相等的對象必須具有相等的哈希碼。

您不能將Object.equalsComparator.compare用於這些業務規則,因為這兩種方法都需要傳遞行為,並且您的規則不是傳遞性的。

例如,name1和name2具有不同的中間名,但name3沒有中間名。 據我了解,您的規則是name1 == name3和name2 == name3。 如果您的規則是可傳遞的,則意味着name1 == name2,而中間名稱不同則不會。

等值法的傳遞性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM