黑马程序员技术交流社区

标题: 关于hashCode的实现 [打印本页]

作者: 1453149997    时间: 2014-4-4 17:28
标题: 关于hashCode的实现
本帖最后由 1453149997 于 2014-4-7 12:27 编辑

有这样一段代码:
public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + ((name == null) ? 0 : name.hashCode());
                return result;
        }
为了保证不同类的对象的哈希值不同,往往要在属性运算出来的值上加上某个数,但是为什么这里要使用prime*result呢?难道直接加上一个整数不行吗?而且为什么要把prime声明为final?

作者: 林发明    时间: 2014-4-4 21:40
为了按照新的规则来判断两个元素是否相同,往往需要复写hashCode方法,从新定义hashCode值的计算方法,所以这里要根据具体需求具体分析,没有说用固定的方式来计算hashCode值。使用prime*result计算也只是程序本身随意设计的,你也可以定义其他的,另外被final修饰的变量实际上就是一个常量了,可以直接换成一个整数
作者: 水蓝    时间: 2014-4-4 23:53
在Java中,对于用到hashCode匹配对象的方法,通常都同时用到equals()方法。
对于一个对象而言,参与计算HashCode的任何值,都应该在对象创建后,不能再被修改了。
否则,对象的HashCode值,也会随之修改,导致(HashMap、HashSet等)依赖HashCode匹配对象的容器,容易产生内存泄漏的问题。

所以,用final修饰,是一个好的编程习惯。

补充一下:
从更高要求的编程安全性角度来讲,不仅参与HashCode计算的局部变量要被final修饰。
甚至有时候参与HashCode计算的成员变量引用,也应该用final来修饰(也就是说,这些成员变量,在构造器初始化之后,就不应该被修改了)

编程需求不一样,这种事情通过Java的编译器检查是做不到的,只是应该是一个编程习惯。
作者: zzmxhm    时间: 2014-4-4 23:57
这种哈希函数的设计方式可以尽可能使不同对象产生不同的哈希值,进而提高哈希表的性能。
作者: 1453149997    时间: 2014-4-5 09:32
水蓝 发表于 2014-4-4 23:53
在Java中,对于用到hashCode匹配对象的方法,通常都同时用到equals()方法。
对于一个对象而言,参与计算Has ...

你的说法比较合理!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2