2017-07-08 75 views
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; 
} 

是什么head = (h + 1) & (elements.length - 1);做代码? 为什么&运营商在这里使用,它的目的是什么。

我的问题不是如何&的作品,但它有什么用处。

任何人都可以解释它吗?

回答

11

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

+0

我选中了,默认数组长度设置为16,满时为2倍。谢谢 – Roshan

1

&手术不是相当于%,认为负数。这不是这里的情况,但也有其他地方,这些事项(如HashMap),其中这是通过做:

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

由于hashcode s为int类型 - 他们可以是负数。使用%而不是&会导致负数,这对于HashMap(因为这是存储桶编号)根本不会发生。

+0

感谢您的知识分享! – Roshan