关于equals()方法:
Object类中对equals()方法的默认的实现方式是 :
return this == obj
那就是说,只有this和obj引用同一个对象,才会返回true。
而我们往往需要用equals来判断 2个对象是否等价(等价的逻辑由我们自己来订),而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals()。
按照约定,equals要满足以下规则:
自反性: x.equals(x) 一定是true;
对null: x.equals(null) 一定是false;
对称性: x.equals(y) 和 y.equals(x)结果一致;
传递性: 如果a.equals(b) ==true, b.equals(c) ==true,那么a.equals(c)==true;
一致性: 在某个运行时期间,2个对象的状态的改变不会不影响equals()的决策结果,那么,在这个运行时期间,无论调用多少次equals(),都返回相同的结果。
关于hashCode()方法:
关于hashCode方法,一致的约定是重写了equals()方法的对象必须重写hashCode()方法。
如果两个对象通过equals()调用后返回是true,那么这两个对象的hashCode()方法必须返回同样的int散列码。
但是如果两个对象通过equals()返回false,他们的hashCode()返回值允许相同。
总结:equals()为true时,hashCode()一定返回相同的散列码。但是我们业务逻辑上不等价的对象不要求散列码不相同。
网友评论