[英]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
這就是它設法提高效率的方式。 只要您的hashCode
和equals
方法遵守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.