Смотрю исходники Java: реализация бакетов HashMap — почему HashCode снова «хэшируется»?

Посмотрел реализацию HashMap в исходниках Java и вот что увидел:

private static int hash(Object x, int length) {
        int h = System.identityHashCode(x);
        // Multiply by -127, and left-shift to use least bit as part of hash
        return ((h << 1) - (h << 8)) & (length - 1);
    }

Вопрос по последней строчке.
Как видно, для получения индекса нужного бакета, у хэш-кода отбрасываются старшие биты с помощью логического AND. Но что это за манипуляции со сдвигами?

1. Как математически доказать, что это лучше простого отбрасывания битов (без этих манипуляций)?
2. Это преобразование могло бы иметь смысл, чтобы увеличить вклад старших битов хешкода, но здесь этого не происходит. Или я ошибаюсь?
3. И еще странность - System.identityHashCode(x) - это де-факто его адрес в памяти. Получается, что HashMap не использует переопределенный HashCode потомка? Или я не тот кусок кода смотрю?
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
TEAMIDEA Тверь
от 70 000 до 120 000 руб.
До 150 000 руб.
Health Gorilla Москва
от 190 000 руб.
19 июн. 2019, в 16:53
5000 руб./за проект
19 июн. 2019, в 16:46
7000 руб./за проект
19 июн. 2019, в 15:48
300 руб./в час