我将通过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或任何哈希...) 违反合同以及错误消息会引发错误吗?
答案 0 :(得分:4)
您的代码违反了合同,但此合同无法由编译器验证。这就是您没有收到任何编译时错误消息的原因。
在集合或映射中插入此类的实例时,可能会出现错误的行为或运行时错误。