【问题标题】:HashSet with two equals object?带有两个等于对象的HashSet?
【发布时间】:2010-10-29 20:45:47
【问题描述】:

我创建了一个对象 HashSet,其值是一个对象(三元组),它是我自己的类。但是我得到一个奇怪的事情,当我的 HashSet 上有两个相等的对象时,这可能吗?这是我在 Triple 类中对等号的覆盖方法

 @Override
 public boolean equals(Object other){
 if (other == null) return false;
 if (other == this) return true;
 if (this.getClass() != other.getClass()) return false;
 Triple otherTriple = (Triple)other;

 if(otherTriple.getSubject().equals(getSubject()) &&
   otherTriple.getPredicate().equals(getPredicate()) &&
   otherTriple.getObject().equals(getObject()))
  return true;
 return false;

}

【问题讨论】:

    标签: java hashset


    【解决方案1】:

    您还需要确保实现 hashCode(),并且当两个 Triples 相等时,它们的 hashCodes 也必须相等。如果你不这样做,你会得到奇怪的行为。

    【讨论】:

    • @user491748:没什么区别。
    【解决方案2】:

    您没有正确覆盖类中的 equals 和 hashCode。以下是如何编写和测试它:

    http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

    【讨论】:

    • 我强烈建议使用 Eclipse 等编辑器提供的 Equals 和 HashCode 构建器功能
    【解决方案3】:

    看起来它只对字符串返回 true...我尝试运行以下代码

                final HashSet<Car> carHashSet = new HashSet<Car>();
        final Car c1 = new  Car("black","ZX","deisel");
        final Car c2 = new  Car("black","ZX","deisel");
        carHashSet.add(c1);
    
        if (carHashSet.contains(c2))
            System.out.println("has c2 obj");
        else
            System.out.println("dont have C2 obj");
    
        final HashSet<String> stringHashSet = new HashSet<String>();
    
        final String k1 = "test";
        final String k2 = "test";//final String k2 = "Test";
    
        stringHashSet.add(k1);
    
        if (stringHashSet.contains(k2))
            System.out.println("has k2 obj");
        else
            System.out.println("dont have k2 obj");
    

    输出如下:

    没有 C2 obj 有k2个obj

    当我将 k2 更改为 final String k2 = "Test"; 时,输出为

    没有 C2 obj 没有k2 obj

    【讨论】:

    • 对象比较总是返回false,除非equals方法被覆盖。这里的字符串比较相等方法显然返回true。要生成的HashCode。
    【解决方案4】:

    我无法理解您的问题,但 hashCode() 和 equals() 语义仅在您计划使用对象作为键时才重要。而且您不能让两个对象在 Map 中评估为相同的哈希值...一个将覆盖另一个

    【讨论】:

    • 任何两个键,keyA 和 keyB,可以具有相同的散列,而不会相互“覆盖”,否则散列表的整个概念将不起作用。只有当keyA.equals(keyB) 时,最后添加的才会覆盖前一个。
    猜你喜欢
    • 2013-03-21
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多