在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);
做什么?
为什么&这里使用的运算符以及它的用途是什么。
我的问题不是如何&有效,但它在这里有什么用。
任何人都可以解释一下吗?
答案 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
来说根本不会发生(因为这是桶号)。