看实例:
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表:
Object | Hash Code |
---|---|
s | 2556 |
sb | 20526976 |
t | 2556 |
tb | 20527144 |
注意字符串 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 或者内存地址。