If x.equals(y) is true, then x == y may be false.
Two objects may be equals but may not represent the same object. The ==
test is made for objects which point to the same reference. Two dogs with the same name and ID for example may be represented by 2 different instances of the Dog class or by the same instance.
If x.equals(y) is false, then (x.hashCode() == y.hashCode()) may be true.
When 2 objects are not equal, their hashCodes can be equal or unequal. There is no contract that governs this.