[英]hashset return false when should return true
我正在編程迷宮,但遇到一些問題。
我有:
HashSet<State> closedList = HashSet<State>(); //it hold State objects
我的State
課程看起來像這樣:
public class State implements Comparable<State>{
private double f;
private double g;
private String state;
private State prev;
.
.
.
closedList.add(state);
closedList().contains(state); // this equals true
但是當我這樣做時:
State temp = State(0,0,"");
temp.setStateName(state.getStateName());
closedList().contains(temp); // this equals false
我已經在State
實現了equals
和hashCode
:
@Override
public int hashCode(){
return state.hashCode();
}
@Override
public boolean equals(Object object){
if(this.state == object){
return true;
}
if(object == null || object.getClass() != this.getClass()){
return false;
}
return false;
}
closedList().contains(state); // this equals true
這是一條紅色鯡魚,它只返回true,因為HashSet在調用equals
之前會先使用==
進行檢查。
您應該嘗試的是這樣的:
State temp = new State(0, 0, "");
System.out.println(temp.equals(temp));
您將發現此返回錯誤。 這是為什么? 好吧,讓我們遵循邏輯。
首先,您有以下檢查:
if(this.state == object){
return true;
}
如果您確實希望這樣做,則意味着您希望以String state
作為參數來調用equals
,如下所示:
temp.equals(temp.getStateName())
(這種情況是上面的調用返回true的情況。)這是不正確的,我們不希望equals對於不相關的類返回true(就equals契約而言,這是不對稱的 )。 我認為這是意外的,就像一個錯誤。 您在編寫代碼時應該仔細考慮代碼的作用。
另外,您應該將字符串與equals
而不是==
進行比較 。
然后是這個構造:
if(object == null || object.getClass() != this.getClass()){
return false;
}
return false;
這毫無意義,因為首先從邏輯上講這是隱含的,無論哪種方式返回false:
if(object == null || object.getClass() != this.getClass()){
return false;
} else {
return false;
}
其次,與較早的檢查結合起來並不是特別合乎邏輯:
if(this.state == object)
return true;
if(object.getClass() != this.getClass())
return false;
如果object
==
返回字符串,則返回true;如果object
的類不是State,則返回false。 這些是互斥的。
因此,您編寫的equals實現無效。 正確的equals
以符合您hashCode
是這樣的:
@Override
public boolean equals(Object object){
if(object == null || object.getClass() != this.getClass()){
return false;
}
State other = (State)object;
return this.state.equals(other.state);
}
首先檢查對象是否不為空,並且其類為State
(您擁有該部分的權利),然后檢查state
成員是否等於另一個對象的state
成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.