Java中的哈希集-比较和哈希键
我知道HashSet.contains()方法使用.equals方法检查相等性,因为它会检查指针以确定它们是否相等 我需要它检查指针处的实际对象是否相等——在我的特定情况下,我需要查看HashSet中是否已经存在正在打开的“节点”(int[]数组)。这对于我的搜索算法至关重要,这样双向迭代深化搜索的实现就不会那么幼稚了 如果可能的话,我仍然希望使用线性搜索时间,或者我应该使用不同的类Java中的哈希集-比较和哈希键,java,queue,hashset,Java,Queue,Hashset,我知道HashSet.contains()方法使用.equals方法检查相等性,因为它会检查指针以确定它们是否相等 我需要它检查指针处的实际对象是否相等——在我的特定情况下,我需要查看HashSet中是否已经存在正在打开的“节点”(int[]数组)。这对于我的搜索算法至关重要,这样双向迭代深化搜索的实现就不会那么幼稚了 如果可能的话,我仍然希望使用线性搜索时间,或者我应该使用不同的类 谢谢你的帮助 如果您的对象实现了equals方法,您可以进行任何需要进行的比较,以确定两个节点对象是否唯一。如果
谢谢你的帮助 如果您的对象实现了
equals
方法,您可以进行任何需要进行的比较,以确定两个节点
对象是否唯一。如果您的对象实现了equals
方法,您可以进行任何需要进行的比较,以确定两个节点
对象是否唯一。引用相等只是.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);
}
}
引用相等只是.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);
}
}
最简单的解决方法是
Collections.newSetFromMap(new IdentityHashMap())
(作为HashSet
的替代品),它不需要对元素或任何东西进行任何包装。最简单的解决方法是Collections.newSetFromMap(new IdentityHashMap())
(作为HashSet
)的替代,它不需要对元素或任何东西进行任何包装。对不起,如果它已经在HashSet中,为什么不直接获取它呢?如果HashSet不是太多,那么这将是O(1)full@j13r:OP想要使用contains()
,它使用equals()进行检查
。据我所知,Java hashset没有.get()。对不起,如果它已经在一个hashset中,为什么不直接获取它呢?如果hashset不太好,这将是O(1)full@j13r:OP想要使用contains()
,它使用equals()
进行检查。据我所知,没有.get()对于Java HashSets,请回答一个快速问题-那么.contains()调用的.equals()方法就是所搜索类型的.equals方法吗?是的,如果您创建一个Set=new HashSet();
那么当您执行Set.contains(someintaraynode);
时,它将使用您的equals()如果obj为空,则.instanceof
的计算结果为false,因此不需要额外检查。另一方面,一个好的初始检查可能是如果obj==this,在这种情况下,您可以立即返回true。true,由于我的奶酪汉堡即将烧焦,所以它很快就消失了:)将使它更标准化更像if(obj==this)返回true;if(obj instanceof IntArrayNode)//比较代码
?快速询问您的答案-那么由.contains()调用的.equals()方法就是所搜索类型的.equals方法?是的,如果您创建一个Set=new HashSet()代码>然后当您执行设置.contains(someIntArrayNode)时
它将使用equals()。instanceof
在obj为null时计算为false,因此不需要额外检查。另一方面,一个好的初始检查可能是obj==this,在这种情况下,您可以立即返回true。true,因为我的奶酪汉堡快要烧了,所以它很快就消失了:)将使它更标准更像if(obj==this)返回true;if(obj instanceof IntArrayNode)//比较代码
?好主意,但我无论如何都在使用包装类,为了通用性,我没有在示例中使用它。好主意,但无论如何我都在使用包装类,为了通用性,我没有在示例中使用它。