Java 相等性测试(相等和散列码方法)

Java 相等性测试(相等和散列码方法),java,Java,按照下面的链接 所以假设如果两个对象相等,也就是说,equals返回true,那么它们的hashcode必须返回相同的值 但请考虑下面的例子 public class Test { public static void main(String args[]) { Demo d1 = new Demo(123); Demo d2 = new Demo(123); System.out.println("d1.hashCode()-->

按照下面的链接

所以假设如果两个对象相等,也就是说,equals返回true,那么它们的hashcode必须返回相同的值

但请考虑下面的例子

public class Test {

    public static void main(String args[]) {
        Demo d1 = new Demo(123);
        Demo d2 = new Demo(123);

        System.out.println("d1.hashCode()-->" + d1.hashCode());
        System.out.println("d2.hashCode()-->" + d2.hashCode());
        System.out.println(d1.equals(d2));
    }
}

class Demo {

    private int name;

    Demo(int name) {
        this.name = name;
    }
    @Override
    public int hashCode() {
        Double d = Math.random() * 1000;
        return d.intValue();
    }
    @Override
    public boolean equals(Object o) {
        if ((o instanceof Demo) && (((Demo) o).getName() == this.getName())) {
            return true;
        } else {
            return false;
        }
    }
    public int getName() {
        return name;
    }
}
上述程序的输出为

d1.哈希代码->85

d2.哈希代码->692

真的

这里的问题是,即使哈希代码不同,equals方法返回true。
所以,这是否意味着对于对象的相等性,我们不需要相同的哈希代码呢?这是哈希代码的糟糕实现,你们应该遵循这个约定

equals与hashcode无关


但是,当您使用哈希数据结构时,您必须遵循这一点。

哈希代码的实现不好,您应该遵循该约定

equals与hashcode无关


但是,当您使用哈希数据结构时,您必须遵循这一点。

您永远不应该使用随机数实现哈希代码!应始终使用equals使用的相同字段计算它。否则,您的对象将无法作为HashMap、HashSet等中的键使用。

您永远不应该使用随机数实现hashCode!应始终使用equals使用的相同字段计算它。否则,您的对象将无法用作HashMap、HashSet等中的键。

实际上,当您实现equals方法时,您应该实现hashCode方法,如果a.equalsb,则a.hashCode==b.hashCode。尽管Java编译器或运行库中没有任何东西可以强制执行此操作。

实际上,当您实现equals方法时,您应该实现hashCode方法,如果a.equalsb,那么a.hashCode==b.hashCode。尽管Java编译器或运行时中没有任何东西强制执行这一点。

一些实例HashMap实现依赖于这样一个事实,即当两个实例相等时,它们的hashcode应该相同。但是,纯粹使用equals不会检查这些实例的哈希代码


在hashmap的情况下,出于性能原因,首先基于对象的hashcode将元素划分为不同的hashbucket。在bucket中,equals用于检查对象的相等性。如果两个相等的实例没有相同的hashCode,它们将在不同的bucket中结束,这可能会由于契约冲突而导致意外行为。

例如HashMap的一些实现依赖于这样一个事实,即当两个实例相等时,它们的hashCode应该相同。但是,纯粹使用equals不会检查这些实例的哈希代码


在hashmap的情况下,出于性能原因,首先基于对象的hashcode将元素划分为不同的hashbucket。在bucket中,equals用于检查对象的相等性。如果两个相等的实例没有相同的hashCode,它们将在不同的bucket中结束,这可能会由于契约违反而导致意外行为。

在hashCode中,始终要求如果两个对象相等,则它们的hashCode必须在另一方面相同hash collectionhashmap,哈希集等无法正常工作

在您的例子中,的一个实现可以是-

public int hashCode() {
    return this.getName();
}
或者如果你想把它混在一起-

public int hashCode() {
    return String.valueOf(this.getName()).hashCode();
}

在Hashcode中,如果两个对象相等,则它们的Hashcode必须始终相同,否则hash collectionsHashMap、HashSet等将无法正常工作

在您的例子中,的一个实现可以是-

public int hashCode() {
    return this.getName();
}
或者如果你想把它混在一起-

public int hashCode() {
    return String.valueOf(this.getName()).hashCode();
}

首先,您不应该使用随机数来实现hashcode方法


首先,您不应该使用随机数来实现hashcode方法


实际上,我的问题是对象的相等性,我们是否需要相同的散列码?是的,我们需要。读我答案的第一句话实际上,我的问题是对象的相等性,我们是否需要相同的散列码?是的,我们需要。读我答案的第一句话