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