簡體   English   中英

是否存在使用equals方法進行鍵檢查的映射?

[英]Does a map using equals method for key checking exists?

我想將數據存儲在具有鍵唯一性的地圖中,但我希望地圖使用鍵類的equals方法。

似乎HashMap沒有使用equals方法(我可能是錯的,如果這樣我的測試是錯誤的)。

我的問題是地圖使用hashCode來檢查重復項,而我想要一個使用equals的地圖實現。

我將時間戳存儲在密鑰中,並且如果時間戳差異不超過定義的數量(假設為1000毫秒),則希望使其等於2個密鑰。

編輯:代碼

public class CleanKey
{
    private DateTime start;
    private DateTime end;

    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((end == null) ? 0 : end.hashCode());
        result = prime * result + ((start == null) ? 0 : start.hashCode());
        return result;
    }

    public boolean equals(Object obj)
    {
        if(this == obj)
            return true;
        if(obj == null)
            return false;
        if(getClass() != obj.getClass())
            return false;
        CleanKey other = (CleanKey) obj;
        if(end == null)
        {
            if(other.end != null)
                return false;
        }
        else if(Math.abs(Millis.millisBetween(end, other.end).getMillis()) > 1000)
            return false;
        if(start == null)
        {
            if(other.start != null)
                return false;
        }
        else if(Math.abs(Millis.millisBetween(start, other.start).getMillis()) > 1000)
            return false;
        return true;
    }
}

似乎HashMap沒有使用equals方法(我可能是錯的,如果這樣我的測試是錯誤的)。

它確實使用equals ,但是首先使用hashCode 它只會打擾在具有相同哈希碼的鍵上調用equals這就是它設法提高效率的方式。 只要您的hashCodeequals方法遵守java.lang.Object指定的約定,就沒有問題。

我將時間戳存儲在密鑰中,並且如果時間戳差異不超過定義的數量(假設為1000毫秒),則希望使其等於2個密鑰。

你不能那樣做。 它違反了平等合同,因為您不能具有傳遞性。 假設我們有三個帶有以下時間戳記的鍵x,y和z:

x    400
y   1200
z   2000

根據您的描述, x.equals(y)為true, y.equals(z)為true,但是x.equals(z)為false,從而違反了Object.equals的約定。

equals方法對非null對象引用實現對等關系:

  • 這是自反的 :對於任何非空參考值x,x.equals(x)應該返回true。
  • 它是對稱的 :對於x和y的任何非空引用值,當且僅當y.equals(x)返回true時,x.equals(y)才返回true。
  • 它是可傳遞的 :對於x,y和z的任何非空引用值,如果x.equals(y)返回true,而y.equals(z)返回true,則x.equals(z)應該返回true。
  • 它是一致的 :對於任何非空引用值x和y,只要未修改對象的equals比較中使用的信息,對x.equals(y)的多次調用將始終返回true或始終返回false。
  • 對於任何非null參考值x,x.equals(null)應該返回false。

您需要在類中重寫hashCode和equals。

此處: 了解HashMap中equals和hashCode的工作原理

看到代碼后進行編輯:

哈希碼返回錯誤的值,因為您正在使用end字段來計算哈希...不同的末端導致不同的哈希。

只是嘗試...返回一個常量,哈希表將起作用

暫無
暫無

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

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