【问题标题】:addFirst method of ArrayDeque ClassArrayDeque 类的 addFirst 方法
【发布时间】:2015-04-03 14:04:38
【问题描述】:

java.util.ArrayDeque类中addFirst方法的代码是

public void addFirst(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[head = (head - 1) & (elements.length - 1)] = e;
    if (head == tail)
        doubleCapacity();
}

这里的意思我看不懂

head = (head - 1) & (elements.length - 1)

另外,假设数组大小为 10。head 为 0,tail 为 9(数组已满)。在这种情况下,将在什么索引系统上进行插入? (我的理解是:如果数组满了,先增加它的大小,然后在arraySize()-1索引中插入。)

【问题讨论】:

  • 我也有同样的疑问 :)

标签: java arraydeque


【解决方案1】:

这里它使用& 运算符意味着它将在两个整数中执行二进制与运算。

假设你的 case head = 0 那么 head 会变成

头 = -1

和elements.length = 16(默认情况下,正如@Adrian所说,它只有2的幂)

所以执行操作-1 & 15(即11111111 & 00001111)它将变为15,这是添加元素的目标位置。

【讨论】:

    【解决方案2】:

    下面这行的功能基本上是(head - 1) MODULO (elements.length),所以当head == 0时,head减去1得到最大可能值而不是-1。

    head = (head - 1) & (elements.length - 1)
    

    10 不是elements 的有效长度,根据实现,elements.length 始终是 2 的幂。如果不是这种情况,操作将无法正常工作。

    理解为什么会这样需要位操作的知识。 为简单起见,假设 elements.length == 16 == 00010000b 并且值的长度是 8 位而不是实际的 32 位:

    (elements.length - 1) 用于获取 n 位长的位掩码,其中 2^n 是元素的当前长度。 (elements.length - 1) == 15 == 00001111b 在这种情况下。

    如果 head > 0head < elements.length(这是给定的),那么 (head - 1) & (elements.length - 1) == (head - 1),因为与 1 进行 AND 运算没有任何作用。

    如果head == 0head - 1 == -1 == 11111111b。 (二进制补码有符号整数表示法,尽管您也可以将其视为简单的整数溢出。)与掩码 (head - 1) & 00001111b == 11111111b & 00001111b == 00001111b == 15 进行与运算,这是想要的值。

    【讨论】:

    • 这正是我想要的:)
    猜你喜欢
    • 2014-04-13
    • 2013-09-19
    • 2016-06-10
    • 1970-01-01
    • 2018-11-01
    • 2012-09-20
    • 2019-05-21
    • 2012-05-17
    • 2016-01-13
    相关资源
    最近更新 更多