Мой вопрос: почему Java сначала делает хэш и 0x7FFFFFFF? Есть ли какая-то конкретная цель?
Ответ 1
Потому что -1 % 10 == -1, который вы, конечно, не хотите индексировать в массив. Принуждение знакового бита к 0 позволяет избежать этой проблемы.
Ответ 2
Потому что:
0x7FFFFFFF - 0111 1111 1111 1111 1111 1111 1111 1111: все 1, за исключением знакового бита.
(hash & 0x7FFFFFFF) приведет к положительному целому числу.
(hash & 0x7FFFFFFF) % tab.length будет находиться в диапазоне длины вкладок.
Ответ 3
Обратите внимание, что Hashtable более или менее устарел и был заменен на HashMap. Для достижения этой же цели используется hash & (table.length-1).
Он также выполняет некоторое смещение бит до того, как можно увидеть здесь. Это должно справиться с плохими реализациями метода hashCode(), которые возвращают числа с низким разнообразием.