[英]Overriding equals method doesn't work
我在這里和其他網站上一直在瀏覽很多類似的問題。 我似乎無法解決這個問題。
我有一節課:
public class Event {
public String Item;
public String Title;
public String Desc;
@Override
public boolean equals(Object o) {
return true;
}
}
我試圖在ArrayList<Event> events
使用此類,但我找不到使events.contains("item")
工作的方法。 我試過debuging,我發現它甚至沒有進入被覆蓋的方法。
我究竟做錯了什么?
那是因為你打破了equals()
合約中指定的對稱性:如果任何事件等於"item"
( 這是一個String ), "item"
也應該等於任何事件。
實際上,Java所做的是在列表中調用indexOf("item")
,並檢查它是否為正數。
現在, indexOf()
在ArrayList
就像這樣工作(參見這里的完整源代碼 ):
for (int i = 0; i < size; i++)
if ("item".equals(elementData[i]))
return i;
所以基本上是這里調用的String的equals()方法,而不是你當然返回false的方法。
只需為函數指定一個Event
參數即可解決此問題,例如:
events.contains( new Event("item", "title", "desc") )
請注意,您必須為您的類創建一個正確的構造函數,以初始化成員。
您還應該覆蓋public int hashCode()
。 這兩種方法密切相關。
閱讀更多相關信息: http : //www.javapractices.com/topic/TopicAction.do?Id=17
當您重寫equals()
方法時,您還必須重寫hashcode()
方法,因為它們齊頭並進。 如果兩個對象相等,則它們必須具有相同的哈希碼。 Hashmaps使用它來評估保存位置。 如果兩個對象不相等,它們可能具有相同的哈希碼,也可能不具有相同的哈希碼。
在這種情況下,您只需要覆蓋equals方法,而不是hashCode方法。
當您想要將類的對象用作HashMap中的鍵時,應該重寫hashCode和equals方法。 HashMap使用array + linkedList的結構。 添加鍵值對時,首先根據鍵的hashCode進行一些計算,得到數組中的索引; 然后遍歷該索引位置的linkedList,以查找鍵值對是否已存在。 如果是,它將用新值覆蓋記錄; 否則將鍵值對添加到該linkedList的末尾。 找到密鑰時,過程很熟悉。 因此,如果未覆蓋hashCode方法,則將無法在數組中進行第一輪搜索。 這就是你需要覆蓋這兩種方法的原因。 這不是說某個地方說這兩種方法之間存在契約,或者它們之間存在密切關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.