这里的&位运算符如何工作?

7
在Java集合类中,我经常看到如下的代码:
  //ArrayDeque
    public E pollFirst() {
    int h = head;
    @SuppressWarnings("unchecked")
    E result = (E) elements[h];
    // Element is null if deque empty
    if (result == null)
        return null;
    elements[h] = null;     // Must null out slot
    head = (h + 1) & (elements.length - 1);
    return result;
}
< p> head = (h + 1) & (elements.length - 1); 这句话是什么意思?& 操作符在这里起到了什么目的。

我的问题不是 & 如何工作,而是它在这里的用途是什么。

有人能解释一下吗?

2个回答

11

这是一个快捷方式,用于计算当 elements.length 为二的整数次幂时的值,公式为 (h + 1) % elements.length。在一些旧版本硬件上,这可能会稍微快一点,但我怀疑在现代 CPU 上是否仍然如此。


我检查了一下,默认数组长度设置为16,当数组满时会加倍。谢谢。 - Roshan

1
那个 & 操作不是 % 的等价物,需要考虑负数。虽然这里不需要,但在其他情况下很重要(例如 HashMap),可以通过以下方式实现:
(n - 1) & hash // n - current capacity, hash - hashcode

由于哈希码是整数值,它们可以是负数。使用“%”而不是“&”将导致负数,但对于HashMap(因为这是桶号),这根本不可能发生。

感谢分享知识!! - Roshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接