这个要看你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);
}
字符串的散列码是由内容导出的,因此两个字符串内容相同,那么它们的散列码也会相同。
当然很难有一个散列函数是绝对均匀的,但是只要根据需要比较的项目来散列,就可以达到散列的目的。
冲突是一定会有的,只是出现的概率比较小,如果需要控制在一定范围内,就需要使用更具体的算法去散列它。
希望楼主看得懂我说的意思。 |