如果有两个布尔字段,我如何实现一个好的哈希码?通常人们只是将整数值添加到其哈希码值中.但是,如果我只是在我的哈希码中添加1或0,我认为它不好.因为如果我有两个A类对象:
obj1.b = true,obj1.c = false.
obj2.b = false,obj2.c = true.
其他一切都是一样的.然后这两个不等对象的哈希码是相同的.我知道这种情况还可以.但想象一下,如果有100个布尔字段,那么会有太多的碰撞对吗?我不希望这么多不同的对象落入同一个桶中.
我在下面做的是为每个字段的不同真值分配不同的数字,因此对象的哈希码可能非常不同.
public class A {
private final String a;
private final boolean b;
private final boolean c;
...
@Override public int hashCode(){
int i,j;
if(b) {
i = 10;
}
else {
i = 0;
}
if(c) {
j = 88;
}
else {
j = 3;
}
int result = 0;
result = 31*result + i + j;
result = 31*result + (a != null ? a.hashCode() …Run Code Online (Sandbox Code Playgroud) 下面的代码是java equals方法的错误实现.它违反了对称规则.但我不知道它是如何违反这条规则的.请指出它在这种方法中违反对称规则的位置.
public class WrongEquals {
private final String variable;
public WrongEquals(String variable) {
this.variable = variable;
}
@override public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof String) {
return variable.equals((String) o);
}
if (o instanceof WrongEquals) {
return variable.equals(((WrongEquals) o).variable);
}
return false;
}
@override
public int hashCode() {
return (variable == null ? 0 : variable.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)