计算hashCode的常见方法
来源:互联网 发布:蓝格眼镜软件 编辑:程序博客网 时间:2024/06/04 18:16
1. 把某个非零常数值,比如说17,保存在一个叫result的int类型的变量中。
2.对于对象中每一个关键域f(值equals方法中考虑的每一个域),完成以下步骤:
a.为该域计算int类型的散列吗c:
i. 如果该域是boolean类型,则计算
- f?0:1
- (int)f
iii.如果该域是long类型,则计算
- (int)(f ^ (f >>> 32))
iv. 如果该域是double类型,则计算
- Double.doubleToLongBits(f)
得到一个long类型的值,然后按照2.a.iii,对该long型值计算散列值。
vi. 如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方式来比较这个域,则同样对这个域递归调用hashCode,如果要求一个更为复杂的比较,则为这个域计算一个“规范表示(canonical representation)”,然后针对这个范式调用hashCode。如果这个域为null,则返回0(或者是某个常数,但习惯上使用0)。
vii. 如果该域是一个数组,则把每一个元素当做单独的域处理。也就是说,递归地应用上诉规则,对每一个重要的元素计算散列值,然后根据2.b的方法把这些散列值组合起来。
b.按照下面的公式,把步骤a得到的散列值组合到result中:
- result = 37 * result + c;
3.返回result
4.写完了hashCode后,问自己相等的实例具有相同的hashCode么?假如不是,找出原因并修正。
在散列码的计算过程中,把冗余域排除在计算之外是可以接受的。换句话说,如果一个域的值可以根据其他域值计算出来,则把这样的域排除在外是可以接受的。
举例,假如一个类PhoneNumber有三个关键域:areaCode,exchange,extension,都是short类型,则hashCode的计算过程为:
- @Override
- public int hashCode(){
- int result = 17;
- result = result * 37 + areaCode;
- result = result * 37 + exchange;
- result = result * 37 + extension;
- return result;
- }
假如PhoneNumber这样处理,那么代码为:
- //延迟初始化
- private volatile int hashCode = 0;
- @Override
- public int hashCode(){
- if(hashCode == 0){
- int result = 17;
- result = result * 37 + areaCode;
- result = result * 37 + exchange;
- result = result * 37 + extension;
- hashCode = result;
- }
- return hashCode;
- }
0 0
- 计算hashCode的常见方法
- 计算hashCode的常见方法
- java String类计算HashCode散列码的方法
- 常见对象_Object类的概述、hashCode()方法、getClass()方法、toString()方法
- Java中hashCode的计算
- java 的hashCode值计算
- String类的hashcode计算
- hashCode方法的使用
- hashCode方法的使用
- java的HashCode方法
- java的hashCode方法
- java的hashCode方法
- HashCode方法的作用
- java的HashCode方法
- java的HashCode方法
- java的HashCode方法
- java的HashCode方法
- java的HashCode方法
- json 和 xml的比较
- OpenCV画HSV的3D直方图 cvQueryHistValue_3D
- list中按照指定属性的值序列化
- spring集成httpclient调用远端接口
- pip命令报错 Bad md5 hash for package xxx
- 计算hashCode的常见方法
- xamarin.ios 录音并播放
- html中的checkbox复选框不确定状态的设置
- The Contents.json describing the image set "BG_Email_Textfield.imageset" must start with a top level
- 面试题43:n个骰子的点数
- java练习
- linux常用命令----查看日志和系统资源占用
- SoundTouch音频处理库源码分析及算法提取(7)
- 程序员能力矩阵 — 敢测吗?看自己在哪个档次