为什么使用1 << 4而不是16?

为什么使用1 << 4而不是16?,第1张

为什么使用1 << 4而不是16?

要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如

1 << 3
1 <<5
,而不是
20
),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

任何

java.util.HashMap
一个的容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND *** 作(
&
)将每个键的哈希码包装到表的长度范围内,就像访问表的方法一样:

final Node<K,V> getNode(int hash, Object key) {    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;    if ((tab = table) != null && (n = tab.length) > 0 &&        (first = tab[(n - 1) & hash]) != null) { /// <-- bitwise 'AND' here        ...

那里

n
是容量,并
(n - 1) & hash
包装哈希值以适合该范围,为该哈希选择表的适当存储区。

(如果

n
不是2的幂,则公式将需要为
Math.abs(hash %n)
,使用取模运算符计算除以后的余数
n
,再加上一个额外的步骤来处理负哈希值。这会起作用,但会更慢。请想象一个示例用 十进制表示
,其中您具有一些任意的哈希值193,498,212,表的任意长度为1,234;虽然
193498212 % 1234
碰巧是842,但表长度恰好是
10的 幂,结果
193498212 % 1000
为212,最后3位数字,在 二进制 ,的功率 2
是一个1随后一些号码0的,所以类似的招是可能的。)




欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5164271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存