Java面试题:两个对象值相同(x.equals(y) == true),但却可有不同的hashCode,这句话对不对呢?
答案是:不对的
如果两个对象 x.equals(y) == true ,那么它们的hashCode应该相同。
java对 equals 方法 是这样规定的:
(1)如果两个对象相同(equals 方法返回 true),那么它们的hashCode 值一定要相同;
(2)如果两个对象的 hashCode 相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增
加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
首先equals 方法必须满足自反性(x.equals(x)必须返回 true)、对称性(x.equals(y)返回 true 时,y.equals(x)也必须返回 true)、传递性(x.equals(y)和 y.equals(z)都返回 true 时,x.equals(z)也必须返回 true)和一致性(当x 和 y 引用的对象信息没有被修改时,多次调用 x.equals(y)应该得到同样的返回值),而且对于任何非 null值的引用 x,x.equals(null)必须返回false。
实现高质量的equals方法的诀窍包括:
1. 使用==操作符检查"参数是否为这个对象的引用";
2. 使用 instanceof 操作符检查"参数是否为正确的类型";
3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;
4. 编写完 equals 方法后,问自己它是否满足对称性、传递性、一致性;
5. 重写 equals 时总是要重写 hashCode;
6. 不要将 equals 方法参数中的 Object 对象替换为其他的类型,在重写时不要忘掉@Override 注解。
原文链接:
https://blog.csdn.net/chang384915878/article/details/79528518