簡體   English   中英

覆蓋equals方法不起作用

[英]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.

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