Ответ 1
Чтобы он имел какой-то смысл, он должен сочетаться с пониманием того, как HashMap распределяет вещи в ковши. Это тривиальная функция, по которой выбирается индекс ведра:
static int indexFor(int h, int length) {
return h & (length-1);
}
Итак, вы можете видеть, что с размером таблицы по умолчанию 16, только 4 младших значащих бита хэша на самом деле имеют значение для выделения ковшей! (16 - 1 = 15, который маскирует хэш на 1111b)
Это может быть плохая новость, если ваша функция hashCode вернулась:
10101100110101010101111010111111
01111100010111011001111010111111
11000000010100000001111010111111
//etc etc etc
Такая хэш-функция вряд ли будет "плохой" каким-либо образом, которая видна ее автору. Но если вы объедините его с тем, как карта выделяет ведра, стрела, MapFail (tm).
Если вы помните, что h - это 32-битное число, это вовсе не магические числа. Он систематически побивает наиболее значимые биты числа вправо в младшие значащие биты. Цель состоит в том, чтобы "различия" числа, которое происходит где угодно "поперек" при просмотре в двоичном формате, становятся видимыми вниз в наименее значимых битах.
Столкновения становятся ограниченными, потому что число различных чисел, имеющих одинаковые соответствующие LSB, теперь значительно ограничено, потому что любые различия, которые происходят где-либо в двоичном представлении, сжимаются в биты, которые имеют значение для bucket-ing.