== equals() without hashCode() ==
a.equals(b)                 = true
a.hashCode() == b.hashCode() = false
HashSet size after adding a then b = 2
HashSet.contains(new equal key)    = false
HashMap.get(equal key)             = null

== with hashCode() ==
HashSet size after adding c then d = 1
HashSet.contains(new equal key)    = true

== a legal but useless hashCode(): return 42 ==
keys                                  = 2000
equals() calls for 2000 gets, constant hash = 2002999
equals() calls for 2000 gets, good hash     = 2000
