Нематематическая простая версия того, почему ...
Простые числа используются для хеширования, чтобы сохранить разнесение.
Возможно, разнесение является более важным из-за реализаций Set и Map.Эти реализации используют последние биты хэш-номеров объектов для индексации внутренних массивов записей.
Например, в HashMap с внутренней таблицей (массивом) для записей размером 8 он будет использовать последние 3 бита хеш-номеров для адресациизапись таблицы.
static int indexFor(int h, int length) {
return h & (length-1);
}
На самом деле это не так, но если объект Integer будет иметь
hash = 4 * number;
, большинство элементов таблицы будут пустыми, но некоторые будут содержать слишком много записей.Это привело бы к дополнительным итерациям и операциям сравнения при поиске определенной записи.
Я думаю, что главной задачей Джошуа Блоха было распределение как можно более простых хэш-значений для оптимизации производительности коллекций путем равномерного распределения объектов в Картах иНаборы.Простые числа, интуитивно понятные, являются хорошим фактором распределения.