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ść}.

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

Moje pytanie brzmi dlaczego Java najpierw robi hash & 0x7FFFFFFF? Czy jest jakiś szczególny cel?

Author: Svante, 2012-02-21

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.

 31
Author: Voo,
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.

 33
Author: sinsedrix,
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.

 4
Author: Philipp Wendler,
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