Eclipse的源菜单有一个“ generate hashCode / equals方法”,它可以生成类似下面的函数。
String name;
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CompanyRole other = (CompanyRole) obj;
if (name == null)
{
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
如果在生成时选择多个字段,hashCode()
并且equals()
Eclipse使用上面显示的相同模式。
我不是哈希函数的专家,我想知道生成的哈希函数有多“好”吗?在哪些情况下会发生故障并导致过多的碰撞?
你可以看到的hashCode函数在执行java.util.ArrayList
的
public int hashCode() {
int hashCode = 1;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
}
return hashCode;
}
这是一个这样的示例,您的Eclipse生成的代码遵循类似的实现方式。但是,如果您觉得自己必须自己实现hashCode,那么Joshua
Bloch在其著名的著作EffectiveJava中提供了一些很好的指南。我将发布该书第9条中的重点。那些是,
- 将一个恒定的非零值(例如17)存储在一个名为result的int变量中。
- 对于对象中的每个有效字段f(即equals方法考虑的每个字段),执行以下操作:
一个。计算该字段的int哈希码c:
一世。如果该字段是布尔值,则计算(f?1:0)。
ii。如果该字段是字节,char,short或int,则计算(int)f。
iii。如果该字段很长,则计算(int)(f ^(f >>> 32))。
iv。如果该字段是浮点型,则计算Float.floatToIntBits(f)。
v。如果该字段是双精度型,则计算Double.doubleToLongBits(f),然后对结果进行哈希运算,如步骤2.a.iii中所述。
vi。如果字段是对象引用,并且此类的equals方法通过递归调用equals来比较字段,则在字段上递归调用hashCode。如果需要更复杂的比较,请为此字段计算一个“规范表示”,并在规范表示上调用hashCode。如果该字段的值为null,则返回0(或其他常数,但0是传统的)
七。如果该字段是数组,则将其视为每个元素都是一个单独的字段。也就是说,通过递归应用这些规则为每个重要元素计算哈希码,并按照步骤2.b组合这些值。如果数组字段中的每个元素都很重要,则可以使用版本1.5中添加的Arrays.hashCode方法之一。
b。将步骤2.a中计算的哈希码c合并为以下结果:
> result = 31 * result + c;
- 返回结果。
4.
当您完成hashCode方法的编写时,请问自己是否相等的实例具有相等的哈希码。编写单元测试以验证您的直觉!如果相等的实例具有不相等的哈希码,请找出原因并解决问题。
我认为Java语言设计人员和Eclipse似乎遵循类似的准则。快乐的编码。干杯。
Eclipse源菜单有一个“generate hashCode/equals method”,它生成如下函数。 如果我在生成和时选择多个字段,Eclipse使用上面显示的相同模式。 我不是散列函数的专家,我想知道生成的散列函数有多“好”?在什么情况下它会发生故障并导致太多碰撞?
问题内容: 默认生成的hashCode和equals实现充其量是丑陋的。 是否有可能使eclipse从HashCodeBuilder和EqualsBuilder生成一个,甚至使用ToStringBuilder生成一个toString? 问题答案: 看看Commons4E 它已经有一段时间没有更新了,但是我猜它不需要改变很多吗? 更新:刚刚针对3.4.1进行了检查,并且工作正常。
问题内容: 建议和有时是必要的,即表示值(类 值类 )来覆盖,[和任选]的方法。这些方法返回的值取决于类及其超类的成员变量的全部或子集。为了实现它们正常,你必须了解理论的一点点 散列 和代数和集理论的一点点(不要太多,几乎一切都在explaind 的javadoc 这些方法和有效的Java形式乔希布洛赫。) 在大多数情况下,此方法的实现遵循一个模板,并且IDE(如Eclipse JDT)包括生成它
问题内容: 我需要生成一个具有给定范围的连续整数数组,以便在以下环境中使用它: 问题答案: 因为您说您已经有一个数字表,所以我建议这样做: 可能比您尝试过的查询更有效。
问题内容: 如何在Eclipse中自动生成基于xml的函数标头注释(@param等)。在Visual Studio中是否有等效的“ ///”快捷方式。 问题答案: 在方法定义之前的那一行中,键入并按Enter。 在IDE中,在方法前键入,然后按Enter。Eclipse将自动生成Javadoc标记并结束
问题内容: hashCode方法的最佳实现中可接受的答案为查找哈希码提供了看似不错的方法。但是我是哈希代码的新手,所以我不太了解该怎么做。 对于1),选择哪个非零值有关系吗?是一样好其他数字,如:黄金? 对于2),我是否将每个值添加到c?如果我有两个字段都是一个,,,等? 我在这堂课上解释得对吗? 问题答案: 该值并不重要,它可以是您想要的任何值。质数将导致值的更好分布,因此首选。 您不必添加它们