为什么Joshua Bloch在有效的java中减少pop方法中堆栈的“大小”值?

时间:2013-09-27 18:39:50

标签: java stack pop effective-java

这是Joshua Bloch撰写的有效Java第2版第2章第24页的代码。 在他定义的pop方法中,他使用elements[--size]。我想知道为什么他使用--size,而elements[size--]应该返回相同的正确名称?

public class Stack {
       private Object[] elements;
       private int size = 0;
       private static final int DEFAULT_INITIAL_CAPACITY = 16;
       public Stack() {
           elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
       public void push(Object e) {
           ensureCapacity();
           elements[size++] = e;
}
       public Object pop() {
           if (size == 0)
               throw new EmptyStackException();
           return elements[--size];
}
       /**
        * Ensure space for at least one more element, roughly
        * doubling the capacity each time the array needs to grow.
        */
       private void ensureCapacity() {
           if (elements.length == size)
               elements = Arrays.copyOf(elements, 2 * size + 1);
} }

2 个答案:

答案 0 :(得分:11)

因为数组是基于0的索引。

想象一下,你有一个包含2个元素的堆栈。

所以堆栈的大小等于2,数组中有以下表示:

elements[0] = elem;
elements[1] = elem;

因此,您需要在从堆栈中弹出elem之前减小大小,否则您将尝试弹出elements[2],这不存在。因此,在这种情况下使用中缀运算符。

return elements[--size];

相当于

size--;
return elements[size];

如果写了elements[size--];,它会尝试弹出elements[2],然后将大小减小1.因此,每次要从堆栈中弹出元素时,都会抛出ArrayIndexOutOfBoundsException

答案 1 :(得分:0)

简单的答案是在变量之前进行迭代之前的减负(或正加号)动作,以及变量之后的迭代之后。

例如:

for(x=0; x<3; x++) {
    System.out.print(x);
}

返回:

012

while:

for(x=0; x<3; ++x) {
    System.out.print(x);
}

返回:

123

因为x变量在迭代之前递增。