JAVA重写hashCode通用方法(摘录自《Effective Java》)
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[])的具体实现:
public static int hashCode(long a[]) { if (a == null) return 0; int result = 1; for (long element : a) { int elementHash = (int)(element ^ (element >>> 32)); result = 31 * result + elementHash; } return result; }
example:
package com.kingdee.cloudhub.stat.domains;
import java.util.Arrays;
public class Person {
private int age;
private String name;
private char sex;
private String[] hoby;
public Person(int age, char sex, String name, String[] hoby) {
this.age = age;
this.sex = sex;
this.name = name;
this.hoby = hoby;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String[] getHoby() {
return hoby;
}
public void setHoby(String[] hoby) {
this.hoby = hoby;
}
public int hashCode() {
int result = 1;
result = 31 * result + age;
result = 31 * result + sex;
result = 31 * result + name.hashCode();
for(String s : hoby) {
result = 31 * result + s.hashCode();
}
return result;
}
public boolean equals(Object obj) {
if(null == obj)
return false;
if(this == obj)
return true;
if (!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.age == p.age && this.sex == p.sex
&& this.name.equals(p.name) && Arrays.equals(this.hoby, p.hoby);
}
}

浙公网安备 33010602011771号