私は、ハッシュテーブルのソースコードに掘ってきました。そして、ハッシュが発生したかが見つかりました:
int index = (hash & 0x7FFFFFFF) % tab.length;
ビット単位のANDここで使用される理由を私は理解していませんか?
我々はバイナリに0x7FFFFFFFで電源を入れた場合、我々は= 111 1111 1111 1111 1111 1111 1111 1111を取得します
私はビット単位を知り、与えるとして1を最初の桁と第二IF = 1は、私たちは、たとえば、いくつかのオブジェクトのハッシュコードを取得するのであれば2314539
、バイナリにそれを回すとやると操作、私たちは実際には同じ数字が出ます:
2314539 = 10 0011 0101 0001 0010 1011
10 0011 0101 0001 0010 1011
&
11 1111 1111 1111 1111 1111
=
10 0011 0101 0001 0010 1011
10 0011 0101 0001 0010 1011 = 2314539
あなたが見ることができるように、この操作は、変更を加えることはありません。だから、ここでのポイントは何ですか?
私たちは、残りの意味(を見てみましょう%
Javaで)。よると、JLS 15.17.3:
バイナリ数値昇格(5.6.2)の後に整数であるオペランドを剰余演算は、その結果の値は、生成
(a/b)*b+(a%b)
に等しいですa
。これは、剰余演算の結果は、被除数が負である場合にのみ負であることができ、被除数が正である場合にのみ陽性であることができることは、この規則に従います。また、結果の大きさは常に除数の大きさよりも小さいです。
仮定しindex
て計算しましたindex = hash % tab.length
。それがそうであった場合、負の値hash
(被除数)は負の値をもたらしますindex
。
しかし、我々は、使用しようとしているindex
添字にtab
それが間になければならないので、0
とtab.length
。
代わりに、実際の計算は、マップhash
符号ビットをマスキングすることにより、第1の非負の数に。それは剰余演算を行います。
だから、ここでのポイントは何ですか?
- あなたの働いていた例では、正のためだった
hash
値。&
負のための違い作るんhash
値を。 - ポイントはマイナス避けるためである
hash
負与える値index
につながる価値をArrayIndexOutOfBoundsException
。