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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如果散列码集中在一块,HashMap或者HashSet在某些区域的负载会很重,不如分布均匀的散列函数快,那么怎么重写hashCode()方法比较好?

1 个回复

倒序浏览
这个要看你equals里的比较需要怎么定义了。
举例来说,如果你需要定义Emloyee类里比较员工的名字,工资,还有雇用时间,只有这三项同时都相同,对象才相同。
那么你的hashCode就需要散列这三项 形如:
public int hashCode(){
       return 7*name.hashCode()+11*new Double(salary).hashCode()+15*hireDay.hashCode();
}
如果你的equals只比较其中两项,就散列对应的两项;同理,散列是根据比较的条件来确定的。
需要说明一点的是:以上例子中的name和hireDay都是String类型的成员变量。
对于String类是使用下列算法来计算散列码的:
int hash = 0;
for(int i = 0 ; i < this.length() ; i++){
    hash = 31 * hash + this.charAt(i);
}
字符串的散列码是由内容导出的,因此两个字符串内容相同,那么它们的散列码也会相同。

当然很难有一个散列函数是绝对均匀的,但是只要根据需要比较的项目来散列,就可以达到散列的目的。
冲突是一定会有的,只是出现的概率比较小,如果需要控制在一定范围内,就需要使用更具体的算法去散列它。

希望楼主看得懂我说的意思。

评分

参与人数 1技术分 +1 收起 理由
刘亚超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马