3

这是来自 Joshua Bloch 的有效 Java 第 2 版第 2 章第 6 项第 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);
} }
4

2 回答 2

11

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

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

因此堆栈的大小等于 2,在数组中具有以下表示:

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

所以你需要在从堆栈中弹出元素之前减小大小,否则你会尝试弹出elements[2]不存在的。所以在这种情况下使用中缀运算符。

return elements[--size];

相当于

size--;
return elements[size];

如果elements[size--];已写入,它将尝试弹出elements[2]然后将大小减小 1。因此,ArrayIndexOutOfBoundsException每次您想从堆栈中弹出一个元素时都会抛出 an 。

于 2013-09-27T18:42:02.490 回答
-1

简单的答案是减号(或加号)在迭代之前在变量之前起作用,在迭代之后在变量之后起作用。

例如:

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

返回:

012

尽管:

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

返回:

123

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

于 2013-09-27T18:49:24.217 回答