繁体   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