The hash code is currently implemented as {code} public int hashCode() { long hash = minSmallest + minLargest << 16 + minLargest >> 48 + maxSmallest << 32 + maxSmallest >> 32 + maxLargest << 48 + maxLargest >> 16; return (int) (hash ^ (hash >>> 32)); } {code} Since addition has higher precedence, the hash value is almost always is zero. (E.g. >> (32 + maxLargest) swaps away at least half of all the bits). The fix is to add some parentheses.