以下代码没有给出我期望的结果:
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));
它不会接受/识别我创建的班级对吗?
先谢谢。
答案 0 :(得分:4)
您需要覆盖hashCode
课程中的equals
和Pair
方法。 LinkedHashSet
(以及使用哈希码的其他Java对象)将使用它们来查找和查找Pair
个对象。
答案 1 :(得分:2)
如果没有自己的hashCode()实现, Java认为两个Pair
个对象只有在它们完全相同的对象和new
时,根据定义,它总是创建一个'新的'对象。在您的情况下,如果Pair
和source
具有相同的值,则您希望target
个对象被认为是相同的 - 为此,您需要告诉Java它应该如何测试{ {1}}对等的对象。 (并且为了使哈希映射按照您期望的方式工作,您还需要生成与equals 一致的哈希码 - 松散地说,这意味着相等的对象必须生成相同的hashCode和不等的对象应该生成不同的哈希码。
大多数IDE都会为您生成合适的hashcode()和equals()方法。我的产生了这个:
Pair