怎么做&位操作员在这里工作?

时间:2017-07-08 09:00:30

标签: java collections bit-manipulation

在Java Collection类中,我经常注意到代码如下

  //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;
}

head = (h + 1) & (elements.length - 1);做什么?    为什么&这里使用的运算符以及它的用途是什么。

我的问题不是如何&有效,但它在这里有什么用。

任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:11)

这是ml64.exe的快捷方式,仅当(h + 1) % elements.length是2的幂时才有效。在一些较旧的硬件上,这可能会稍快一些,但我怀疑现代CPU仍然如此。

答案 1 :(得分:1)

对于&%操作不是 true 等效,请考虑负数。情况并非如此,但还有其他重要的地方(如HashMap),这可以通过以下方式完成:

(n - 1) & hash // n - current capacity, hash - hashcode

由于hashcode是int值 - 它们可以是负数。使用%代替&会导致负数,这对于HashMap来说根本不会发生(因为这是桶号)。