>>>是逻辑右移(无符号扩展)(JLS 15.19 Shift
Operators),并且
^是按位异或(JLS
15.22.1 Integer Bitwise
Operators)。
关于这样做的原因,文档提供了一个提示:
HashMap使用2的幂的长度表,并通过掩盖掉哈希码的较高位并仅获取其较低位来哈希键。
// HashMap.java -- edited for concisenessstatic int indexFor(int h, int length) { return h & (length-1);}public V put(K key, V value) { int hash = hash(key.hashCode()); int index = indexFor(hash, table.length); // ...}
因此,
hash()尝试使相关性与较高的位有关,否则将被屏蔽掉(
indexFor基本上丢弃的较高位,
h而仅在处使用较低的
k位
length== (1 << k))。
将此与
Hashtable使用密钥的哈希码的方式(应该没有二乘幂长度表)进行对比。
// Hashtable.java -- edited for concisenesspublic synchronized V get(Object key) { int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % table.length; // ...}
通过执行更昂贵的
%*** 作(而不是简单的位屏蔽),的性能对
Hashtable在较低位(尤其
table.length是素数)中分布较差的哈希码不太敏感。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)