2017-07-08 53 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