[英]Comparing two different objects using contains(Object o) returns false, when equals(Object o) returns 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.equals或Comparator.compare用於這些業務規則,因為這兩種方法都需要傳遞行為,並且您的規則不是傳遞性的。
例如,name1和name2具有不同的中間名,但name3沒有中間名。 據我了解,您的規則是name1 == name3和name2 == name3。 如果您的規則是可傳遞的,則意味着name1 == name2,而中間名稱不同則不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.