问题与#34;包含" hashset方法(Java)

时间:2014-01-13 22:52:27

标签: java set contains hashset

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

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));

它不会接受/识别我创建的班级对吗?

先谢谢。

2 个答案:

答案 0 :(得分:4)

您需要覆盖hashCode课程中的equalsPair方法。 LinkedHashSet(以及使用哈希码的其他Java对象)将使用它们来查找和查找Pair个对象。

答案 1 :(得分:2)

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

大多数IDE都会为您生成合适的hashcode()和equals()方法。我的产生了这个:

Pair