Composit PK hashcode与equals

equals:

  public boolean equals(Object obj)

  Object类中默认的实现方式是  :   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 和 b equals , b 和 c  equals,那么 a 和 c也一定equals。

  一致性:  在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。

hashcode:

  public int hashCode()

  这个方法返回对象的散列码,返回值是int类型的散列码。
  对象的散列码是为了更好的支持基于哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet 等。

  关于hashCode方法,一致的约定是:

  重写了euqls方法的对象必须同时重写hashCode()方法。

  如果2个对象通过equals调用后返回是true,那么这个2个对象的hashCode方法也必须返回同样的int型散列码

  如果2个对象通过equals返回false,他们的hashCode返回的值允许相同。

  对hashCode方法的一致约定要求:

  第一:在某个运行时期间,只要对象的(字段的)变化不会影响equals方法的决策结果,那么,在这个期间,无论调用多少次hashCode,都必须返回同一个散列码。

  第二:通过equals调用返回true 的2个对象的hashCode一定一样。

  第三:通过equasl返回false 的2个对象的散列码不需要不同,也就是他们的hashCode方法的返回值允许出现相同的情况。
  总结一句话:等价的(调用equals返回true)对象必须产生相同的散列码。不等价的对象,不要求产生的散列码不相同。

猜你喜欢

转载自www.cnblogs.com/GGGGGGG/p/8977809.html