Java中的HashSet - 比较和hashkeys

时间:2012-03-24 00:15:46

标签: java queue hashset

我知道HashSet.contains()方法使用.equals方法检查相等性,因为它检查指针是否相等。

我需要它来检查指针上的实际对象是否相等 - 在我的具体情况下,我需要查看HashSet中是否已经存在打开的“Node”(一个int []数组)。这对我的搜索算法至关重要,因此我的双向迭代深化搜索的实现并不那么天真。

如果可能,我仍然喜欢线性搜索时间,或者我应该使用不同的类?

感谢您的帮助。

3 个答案:

答案 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),它不需要对您的元素或任何内容进行任何包装。