我知道HashSet.contains()方法使用.equals方法检查相等性,因为它检查指针是否相等。
我需要它来检查指针上的实际对象是否相等 - 在我的具体情况下,我需要查看HashSet中是否已经存在打开的“Node”(一个int []数组)。这对我的搜索算法至关重要,因此我的双向迭代深化搜索的实现并不那么天真。
如果可能,我仍然喜欢线性搜索时间,或者我应该使用不同的类?
感谢您的帮助。
答案 0 :(得分:5)
引用相等只是.equals()的默认实现。您可以将数组放在一个覆盖equals和hashCode的包装类中以检查内容。注意:为了使其正常工作,将内容放入集合后,内容不得更改。
import java.util.Arrays;
public class IntArrayNode {
private int[] array;
public IntArrayNode(int[] array) {
this.array = array;
}
//getter and setter
public boolean equals(Object obj) {
if (obj != null && obj instanceof IntArrayNode) {
return Arrays.equals(this.array, ((IntArrayNode) obj).array);
} else {
return false;
}
}
public int hashCode() {
return Arrays.hashCode(this.array);
}
}
答案 1 :(得分:0)
如果您的对象实现了equals
方法,您可以进行任何比较,以确定您的两个Node
对象是否唯一。
答案 2 :(得分:0)
最简单的解决方法是Collections.newSetFromMap(new IdentityHashMap<E, Boolean>())
(代替HashSet
),它不需要对您的元素或任何内容进行任何包装。