【发布时间】:2017-06-27 19:03:36
【问题描述】:
以下代码来自标准 java 库中的 ArrayDeque。我选择它有点武断,因为在整个代码中有很多这种想法的例子。
public void addFirst(E e) {
if (e == null)
throw new NullPointerException();
elements[head = (head - 1) & (elements.length - 1)] = e;
if (head == tail)
doubleCapacity();
}
基本上,当我读到它时,head 的值减一,然后按位“与”与 elements.length 减一。此操作确定数组的哪个索引将保存新值 e,并允许循环回绕到数组的开头。到目前为止还好(希望没有错)。
但接下来我们就来了:
if (head == tail) doubleCapacity();
head 和 tail 是整数。即使它们在按位“与”之后等于数组中的相同位置(意味着数组已满并且需要扩展),这也不会使它们等于整数(这是正在测试的内容,对吗?)。
所以...我不明白这是如何工作的。
谁能帮忙?
编辑澄清我指的是数组的索引,而不是它的任何元素。
【问题讨论】:
-
你说的不等于整数是什么意思?如果
head存储10的值,tail存储10的值,它们是相等的。 -
我的意思是 int 变量 head 和 tail 有不同的值。它们在被布尔值添加后指向数组中的相同位置......因为溢出......但它们本身没有相同的值。
-
head和index是数组的索引,而不是数组元素。 -
对...它们是数组的索引。不是数组中的元素。我可以编辑它,但问题没有改变。
-
此时它们已经以数组长度为模减少了,所以这 是“在按位与之后”。