Почему Java использует (hash & 0x7FFFFFFF)% tab.length для определения индекса ключа? - PullRequest
25 голосов
/ 21 февраля 2012

Из ссылки ниже я знаю, что Java использует (hash & 0x7FFFFFFF) % tab.length, чтобы решить, в какой слот массива поместить {ключ, значение}.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable.put%28java.lang.Object%2Cjava.lang.Object%29

Мой вопрос: почему Java сначала делает хэш & 0x7FFFFFFF? Есть ли какая-то конкретная цель?

Ответы [ 3 ]

35 голосов
/ 21 февраля 2012

Потому что:

  • 0x7FFFFFFF - это 0111 1111 1111 1111 1111 1111 1111 1111: все 1, кроме знака знака.

  • (hash & 0x7FFFFFFF) приведет к положительному целому числу.

  • (hash & 0x7FFFFFFF) % tab.length будет в диапазоне длины табуляции.

31 голосов
/ 21 февраля 2012

Потому что -1 % 10 == -1, который вы, конечно, не хотите индексировать в массив.Если принудительно установить бит знака в 0, эта проблема будет устранена.

4 голосов
/ 21 февраля 2012

Обратите внимание, что Hashtable более или менее устарел и был заменен на HashMap.Этот использует hash & (table.length-1) для достижения той же цели.

Он также выполняет некоторое смещение битов прежде, чем можно увидеть здесь .Это должно справиться с плохими реализациями метода hashCode(), которые возвращают числа с низким разнесением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...