Java hashCode 方法

看实例:

String s = "Ok"; 

StringBuilder sb = new StringBuilder(s); 

System.out.println(s.hashCode() + " " + sb.hashCode()); 

String t = new String("Ok"); 

StringBuilder tb = new StringBuilder(t); 

System.out.println(t.hashCode() + " " + tb.hashCode());


上面对象的Hash Code表:

ObjectHash Code
s2556
sb20526976
t2556
tb20527144


注意字符串 s 与 t 的 hash code 相同,因为对于字符串而言,hash code 取决于字符串内容

int hash = 0; 

for (int i = 0; i < length(); i++)   

    hash = 31 * hash + charAt(i);


sb 与 tb 不同是因为 StringBuilder 没有定义 hashCode 方法,默认 Object 类的 hashCode,由对象内存地址决定。


重写 hashCode

public int hashCode() {   

    return 7 * Objects.hashCode(name) + 11 * Double.hashCode(salary) + 13 * Objects.hashCode(hireDay); 

}


或者

public int hashCode() {

    return Objects.hash(name, salary, hireDay);

}


数组中使用 Arrays.hashCode 方法。


equals 和 hashCode 必须是兼容的。如果 x.equals(y) == true,则 x.hashCode() 必须与 y.hashCode() 结果一致。例如:Employee.equals  是使用 employee id 进行比对,那么 hashCode 方法也应该 hash id,而不是 name 或者内存地址。



 

展开阅读全文