Dlaczego Java używa (hash & 0x7FFFFFFF) % tab.długość decydująca o indeksie klucza?
Z poniższego linku wiem, że Java używa (hash & 0x7FFFFFFF) % tab.length
, aby zdecydować, w którym slocie tablicy umieścić {klucz, wartość}.
Moje pytanie brzmi dlaczego Java najpierw robi hash & 0x7FFFFFFF? Czy jest jakiś szczególny cel?
3 answers
Ponieważ -1 % 10 == -1
którego z pewnością nie chcesz indeksować do tablicy. Wymuszenie bitu znaku na 0 pozwala uniknąć tego problemu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-21 15:58:20
Ponieważ:
0x7FFFFFFF
is 0111 1111 1111 1111 1111 1111 1111 1111: wszystkie 1 z wyjątkiem bitu znaku.(hash & 0x7FFFFFFF)
spowoduje dodatnią liczbę całkowitą.(hash & 0x7FFFFFFF) % tab.length
będzie w zakresie długości karty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-21 16:05:18
Zauważ, że Hashtable
jest mniej lub bardziej przestarzały i został zastąpiony przez HashMap
. Ten używa hash & (table.length-1)
do osiągnięcia tego samego celu.
Robi również pewne przesunięcia bitów wcześniej, jak widać tutaj. Ma to na celu poradzenie sobie ze złymi implementacjami metody hashCode()
, która zwraca liczby o małej różnorodności.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-21 16:04:50