What are the important things to consider when implementing equals method?
reflexive: an object must equal itself.
symmetric: x. equals(y) must return the same result as y. equals(x)
transitive: if x. equals(y) and y. ...
consistent: the value of equals() should change only if a property that is contained in equals() changes (no randomness allowed)