Equals() 结果一致,但 TreeMap.containsKey() 结果不一致

2023-12-12

我有以下对象Node:

    private class Node implements Comparable<Node>(){
         private String guid();

         ...

         public boolean equals(Node o){
             return (this == o);
         }

         public int hashCode(){
              return guid.hashCode();
         }

         public int compareTo(Node o){
            return (this.hashCode() - o.hashCode());
         }

         ...

    }

我在下面使用它TreeMap:

TreeMap<Node, TreeSet<Edge>> nodes = new TreeMap<Node, TreeSet<Edge>>();

现在,树形图被用在一个名为的类中Graph存储当前在图中的节点,以及它们的一组边(来自类Edge)。我的问题是当我尝试执行时:

   public containsNode(n){
        for (Node x : nodes.keySet()) {
            System.out.println("HASH CODE: ");
            System.out.print(x.hashCode() == n.hashCode());
            System.out.println("EQUALS: ");
            System.out.print(x.equals(n));
            System.out.println("CONTAINS: ");
            System.out.print(nodes.containsKey(n));
            System.out.println("N: " + n);
            System.out.println("X: " + x);
            System.out.println("COMPARES: ");
            System.out.println(n.compareTo(x));
            }
        }

我有时会得到以下信息:

哈希码:true 等于:true 包含:falseN: foo X: foo 比较:0

有人知道我做错了什么吗?我对这一切还是陌生的,所以如果我忽略了一些简单的事情,我提前道歉(我知道hashCode()并不重要TreeMap,但我想我应该包括它)。

编辑1:添加compareTo()方法信息。


这里有一些问题。

  • 你还没有覆盖Object.equals. Use @Override public boolean equals(Object obj).
  • 存在潜在的整数溢出错误compareTo。这可能是此特定错误的原因。它会扰乱排序,因此搜索很可能不会成功。
  • The compareTo如果哈希代码恰好匹配,该方法声称两个实例相等(如果没有代码审查,这可能是一个很难捕获的错误)。

对于整数溢出问题,请参阅问题为什么我的简单比较器坏了?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Equals() 结果一致,但 TreeMap.containsKey() 结果不一致 的相关文章

随机推荐