小编loo*_*oop的帖子

布尔字段的哈希码实现

如果有两个布尔字段,我如何实现一个好的哈希码?通常人们只是将整数值添加到其哈希码值中.但是,如果我只是在我的哈希码中添加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 hashcode

9
推荐指数
2
解决办法
5864
查看次数

为什么这个java equals()方法违反了对称实现规则?

下面的代码是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)

java

3
推荐指数
1
解决办法
1039
查看次数

标签 统计

java ×2

hashcode ×1