我有一个类,它是一个集合,我重写.equals()来检查这些集合是否是元素相等的。我如何覆盖HashCode,因为从我所看到的情况来看,两者之间存在一些相互依存的关系
public class ASet{
Set g=new Set();
public boolean equals(Object s1)
{
Set S= (Set)s1;
for(Object o : S.getcontents())
{
for(Object r : g.getcontents())
{
if(!o.equals(r))
{
return false;
}
}
}
return true;
}
public int hashCode() {
?????????
}发布于 2014-01-27 01:40:07
首先,让我们修复您的equals实现,因为它是不正确的:您的代码不是对元素进行成对比较,而是根据第二个集合的每个元素检查第一个集合的每个元素。因此,在这个方案下,这两个集合被认为是相等的唯一情况是,两个集合都包含一个元素,它们包含的元素是相同的。
您应该制作两个迭代器,并在一个循环中将它们循环在一起。现在,您可以将第一个迭代器返回的元素与第二个迭代器返回的元素进行比较,如果它们不相同,则返回false。
现在让我们来做哈希代码:理论上,您可以简单地将元素的单个哈希代码相加,这将是hashCode()的有效实现。
public int hashCode() {
int res = 0;
for(Object r : g.getcontents()) {
res += r.hashCode();
}
return res;
}但是,这并不是您能做的最好的哈希码,因为两个排序不同的集合将具有相同的哈希代码。一个更好的方法是在向其添加下一个哈希码之前,将前一个值乘以一个素数(31是一个常见的例子),如下所示:
public int hashCode() {
int res = 0;
for(Object r : g.getcontents()) {
res = 31 * res + r.hashCode();
}
return res;
}最后,关于集合及其哈希代码的一点说明:重写哈希代码的主要目的是使您可以在基于哈希的集合(哈希集或哈希映射)中将对象用作键。但是,您应该非常小心地使用可变对象(如set和list)作为映射或集合中的键,因为更改已放置到容器中的键将危及基于散列的容器的结构完整性。
https://stackoverflow.com/questions/21371626
复制相似问题