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