A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1453149997 中级黑马   /  2014-4-4 17:28  /  1510 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

4 个回复

倒序浏览
为了按照新的规则来判断两个元素是否相同,往往需要复写hashCode方法,从新定义hashCode值的计算方法,所以这里要根据具体需求具体分析,没有说用固定的方式来计算hashCode值。使用prime*result计算也只是程序本身随意设计的,你也可以定义其他的,另外被final修饰的变量实际上就是一个常量了,可以直接换成一个整数

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
在Java中,对于用到hashCode匹配对象的方法,通常都同时用到equals()方法。
对于一个对象而言,参与计算HashCode的任何值,都应该在对象创建后,不能再被修改了。
否则,对象的HashCode值,也会随之修改,导致(HashMap、HashSet等)依赖HashCode匹配对象的容器,容易产生内存泄漏的问题。

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

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

编程需求不一样,这种事情通过Java的编译器检查是做不到的,只是应该是一个编程习惯。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
这种哈希函数的设计方式可以尽可能使不同对象产生不同的哈希值,进而提高哈希表的性能。
回复 使用道具 举报
水蓝 发表于 2014-4-4 23:53
在Java中,对于用到hashCode匹配对象的方法,通常都同时用到equals()方法。
对于一个对象而言,参与计算Has ...

你的说法比较合理!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马