首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

effective-equals , hashCode

2012-12-19 
effective------equals , hashCode覆盖equals时总是覆盖hashCode:你都认为他们是同一个东西了,当然应该放

effective------equals , hashCode

覆盖equals时总是覆盖hashCode:你都认为他们是同一个东西了,当然应该放到同一个桶中。。。public boolean equals(Object o){   if(o == this) return true;   if(!(o instanceof PhoneNumber))return false;   PhoneNumber pn = (PhoneNumber)o;   return pn.lineNumber == lineNumber        && pn.prefix == prefix        && pn.areaCode == areaCode;}下面是构建高效hashCode的原则:1.把某个非零的常数值,比如17,保存在一个名为result的int类型的变量中。2。 对于对象的每个关键域f(指equals方法中涉及的每个域),完成以下步骤:  a. 为该域计算int类型的散列码c:     i.  如果该域是boolean类型,则计算(f?1:0).     ii. 如果该域是byte,char,short,int类型,则计算(int)f.     iii. 如果该域是long类型,则计算(int)(f^(f>>>32)).     iv. 如果该域是float类型,则计算Float.floatTointBits(f).     v.如果该域是double类型,则计算Double.doubleToLongBits(f),然后按照步骤iii,为得到的long类型值计算散列值。      vi.如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方法来比较这个域,则同样为这个域递归调用hashCode,如果需要更复杂的比较,则为这个域计算一个"范式",然后针对这个范式调用hashCode, 如果数组域的值为null,则返回0.      vii. 如果该域是一个数组,则要把每一个元素当作单独的域来处理,也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤2.b 中的做法吧这些散列值组合起来。如果数组域中的每个元素都很重要,可以利用发行版本1.5中增加的一个Arrays.hashCode方法。

热点排行