== what the JDK uses ==
"hello".hashCode()            = 99162322
31*h + c over "hello"          = 99162322
List.of(1,2,3).hashCode()      = 30817
Arrays.hashCode({1,2,3})       = 30817
Objects.hash(1,2,3)            = 30817
Set.of(1,2,3).hashCode()       = 6  (sum of elements)
Map.of(1,2).hashCode()         = 3  (key^value per entry, summed)

== Objects.hash(...) traps ==
Objects.hash("a") vs "a".hashCode() = 128 vs 97
Objects.hash(1, 2) == Objects.hash(2, 1) ? false
Objects.hash() (no args)       = 1
Objects.hash((Object) null)    = 31

== Arrays as fields ==
x.equals(y) = false, Arrays.equals = true
x.hashCode() == y.hashCode() ? false
Arrays.hashCode equal ? true

== equal hashCodes do not mean equal objects ==
"Aa".hashCode() = 2112, "BB".hashCode() = 2112, equal strings? false
