【问题标题】:Issue with "contains" hashset method (Java)“包含”哈希集方法(Java)的问题
【发布时间】:2014-02-01 21:21:48
【问题描述】:

以下代码没有给我预期的结果:

public static void main (String[] args) {

    Set<Pair> objPair = new LinkedHashSet<Pair>();
    objPair.add(new Pair(1, 0));

    System.out.println("Does the pair (1, 0) exists already? "+objPair.contains(new Pair(1, 0)));

}

private static class Pair {

    private int source;
    private int target;

    public Pair(int source, int target) {
      this.source = source;
      this.target = target;
    }        
}

结果将是:

Does the pair (1, 0) exists already? false

我不明白为什么它不起作用。 或者也许我使用了错误的“包含”方法(或出于错误的原因)。

还有一个问题, 如果我两次添加相同的值,它将被接受,即使是一个集合

objPair.add(new Pair(1, 0));
objPair.add(new Pair(1, 0));

它不会接受/识别我创建的类 Pair?

提前致谢。

【问题讨论】:

  • HashSet 使用哈希码。你的hashCode() 实现在哪里?
  • 哦,是的,我是这方面的新手,我可能需要进一步研究它:) 非常感谢!

标签: java set contains hashset


【解决方案1】:

您需要在 Pair 类中覆盖 hashCodeequals 方法。 LinkedHashSet(和其他使用哈希码的 Java 对象)将使用它们来定位和查找您的 Pair 对象。

【讨论】:

    【解决方案2】:

    如果没有您自己的 hashCode() 实现,Java 仅当两个 Pair 对象是完全相同的对象时才认为它们相等,而new,根据定义,总是创建一个“新”对象。在您的情况下,如果 sourcetarget 具有相同的值,您希望 Pair 对象被视为相等 - 为此,您需要告诉 Java 它应该如何测试 Pair 对象的相等性。 (并且要使哈希映射按您期望的方式工作,您还需要生成一个 与 equals 一致的哈希码 -- 松散地说,这意味着相等的对象 必须 生成相同的hashCode,不相等的对象应该生成不同的hashcode。

    大多数 IDE 会为您生成不错的 hashcode() 和 equals() 方法。我的生成了这个:

      @Override
       public int hashCode() {
          int hash = 3;
          hash = 47 * hash + this.source;
          hash = 47 * hash + this.target;
          return hash;
       }
    
       @Override
       public boolean equals(Object obj) {
          if (obj == null) {
             return false;
          }
          if (getClass() != obj.getClass()) {
             return false;
          }
          final Pair other = (Pair) obj;
          if (this.source != other.source) {
             return false;
          }
          if (this.target != other.target) {
             return false;
          }
          return true;
       }
    

    【讨论】:

    • 不敢相信它是“唯一的”这个 :) 我忘了说我是 Java 新手(不过你们注意到了......)非常感谢!
    • 我们曾经都是新人...... :)
    • @NyanMaru 建议您阅读大量 Java:amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683 -- 这本书中的第 9 项涵盖了 hashCodeequals -- 我每隔几年就会重读这本书并且每次都学点新东西,第二版出来的时候就买了。
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多