通用的Java hashCode重写方案
来源:互联网 发布:软件安全测试工具 编辑:程序博客网 时间:2024/05/16 23:39
Google首席Java架构师Joshua Bloch在他的著作《Effective Java》中提出了一种简单通用的hashCode算法
1. 初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17;
2. 选取equals方法中用于比较的所有域,然后针对每个域的属性进行计算:
(1) 如果是boolean值,则计算f ? 1:0
(2) 如果是byte\char\short\int,则计算(int)f
(3) 如果是long值,则计算(int)(f ^ (f >>> 32))
(4) 如果是float值,则计算Float.floatToIntBits(f)
(5) 如果是double值,则计算Double.doubleToLongBits(f),然后返回的结果是long,再用规则(3)去处理long,得到int
(6) 如果是对象应用,如果equals方法中采取递归调用的比较方式,那么hashCode中同样采取递归调用hashCode的方式。 否则需要为这个域计算一个范式,比如当这个域的值为null的时候,那么hashCode 值为0
(7) 如果是数组,那么需要为每个元素当做单独的域来处理。如果你使用的是1.5及以上版本的JDK,那么没必要自己去 重新遍历一遍数组,java.util.Arrays.hashCode方法包含了8种基本类型数组和引用数组的hashCode计算,算法同上,
java.util.Arrays.hashCode(long[])的具体实现:
Arrays.hashCode(...)只会计算一维数组元素的hashCOde,如果是多维数组,那么需要递归进行hashCode的计算,那么就需要使用Arrays.deepHashCode(Object[])方法。
4. 测试,hashCode方法是否符合文章开头说的基本原则,这些基本原则虽然不能保证性能,但是可以保证不出错。
2. 为什么每次需要使用乘法去操作result? 主要是为了使散列值依赖于域的顺序,还是上面的那个例子,Test t = new Test(1, 0)跟Test t2 = new Test(0, 1), t和t2的最终hashCode返回值是不一样的。
3. 为什么是31? 31是个神奇的数字,因为任何数n * 31就可以被JVM优化为 (n << 5) -n,移位和减法的操作效率要比乘法的操作效率高的多。
0 0
- 通用的Java hashCode重写方案
- 通用的Java hashCode重写方案
- 通用的Java hashCode重写方案
- 通用的Java hashCode重写方案
- 通用的Java hashCode重写方案
- 通用的Java hashCode重写方案
- 通用的Java hashCode重写方案
- 【Java】对几个通用的hashCode重写方案的一些思考和探讨
- 对几个通用的Java hashCode重写方案的一些思考和探讨
- 对几个通用的Java hashCode重写方案的一些思考和探讨
- 【Java】对几个通用的hashCode重写方案的一些思考和探讨
- java通用方法equals、hashcode的重写注意事项
- 基本类型的hashCode重写方案
- java重写hashcode的方法
- Java toString equals hashCode 方法的重写
- Java 重写 equals 与 hashCode 的注意事项
- java集合---hashcode和equals的重写
- java 重写 hashCode、equals
- iOS app配置多个环境变量
- overlay机制
- acm字符串逆序输出
- web 前端修改 自动刷新 插件使用 liveReload
- 塘边村支书吴元祥贪污
- 通用的Java hashCode重写方案
- js 获取最后一个字符
- 密码学概述
- Excel单元格内容什么情况下显示为#
- android签名机制
- <C语言漫谈录>3——关键字,变量定义和声明
- 转场动画相关方法介绍
- FSCalendar的简单封装和使用
- RESTful API 设计指南