为什么'等于'在Java中是否使用不同的哈希码?

时间:2016-10-09 10:55:26

标签: java equals

我将通过java.lang.Object API来说明对象相等点的下方: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

public boolean equals(Object obj):

  

通常需要覆盖hashCode方法   这个方法被覆盖,以便维持一般合同   hashCode方法,声明相等的对象必须相等   哈希码。

现在要测试上面的理论"相等的对象必须有相同的哈希码",我已经提出了以下简单的代码:

public class Product {

    private String name;

    public Product(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        //always returns true for all objects
        return true;
    }

    @Override
    public int hashCode() {
        //Different hascodes for different objects
        if(name.equals("PRODUCT1")) {
            return 10;
        } else {
            return 20;
        }
    }

    public static void main(String[] args) {
        Product p1 = new Product("PRODUCT1");
        Product p2 = new Product("PRODUCT2");

        if(p1.equals(p2)) {
            System.out.println(" p1 p2 are equal **** ");
        } else {
            System.out.println(" p1 p2 are NOT equal **** ");
        }

    HashSet<Product> set = new HashSet<>();
    set.add(p1);
    set.add(p2);
    System.out.println(" size :"+set.size());
    }
}

输出:

p1 p2等于****

尺寸:2

因此,上述代码不违反/违反API声明&#34;相等的对象必须具有相同的哈希码&#34;即,相等的对象不需要具有相同的哈希码?

我理解编译器无法验证此合同,但是JVM在运行时是否抱怨任何错误/警告声明相等的对象应该具有不同的哈希码?

我是否理解相同的对象应该具有相同的正确性 散列码&#39;严格遵循仅为了改进性能 巨大/大型对象比较,没有JRE(没有人)抱怨 差不多(除了失败的表现)?如果没有,你能帮忙吗? 一个例子(使用hashsets或hashmaps或任何哈希...) 违反合同以及错误消息会引发错误吗?

1 个答案:

答案 0 :(得分:4)

您的代码违反了合同,但此合同无法由编译器验证。这就是您没有收到任何编译时错误消息的原因。

在集合或映射中插入此类的实例时,可能会出现错误的行为或运行时错误。