栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Eclipse生成的hashCode函数是否有好处?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Eclipse生成的hashCode函数是否有好处?

你可以看到的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条中的重点。那些是,

  1. 将一个恒定的非零值(例如17)存储在一个名为result的int变量中。
  2. 对于对象中的每个有效字段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;
  1. 返回结果。

4.
当您完成hashCode方法的编写时,请问自己是否相等的实例具有相等的哈希码。编写单元测试以验证您的直觉!如果相等的实例具有不相等的哈希码,请找出原因并解决问题。

我认为Java语言设计人员和Eclipse似乎遵循类似的准则。快乐的编码。干杯。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/508581.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号