bra*_*orm 3 java stack 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);
} }
Run Code Online (Sandbox Code Playgroud)
Ale*_* C. 11
因为数组是基于0的索引.
想象一下,你有一个包含2个元素的堆栈.
所以堆栈的大小等于2,数组中有以下表示:
elements[0] = elem;
elements[1] = elem;
Run Code Online (Sandbox Code Playgroud)
因此,您需要在从堆栈中弹出elem之前减小大小,否则您将尝试弹出elements[2],这不存在.因此在这种情况下使用中缀运算符.
return elements[--size];
Run Code Online (Sandbox Code Playgroud)
相当于
size--;
return elements[size];
Run Code Online (Sandbox Code Playgroud)
如果elements[size--];被写入,它将尝试弹出elements[2],然后将大小减小1.因此,ArrayIndexOutOfBoundsException每次要从堆栈中弹出元素时都会抛出.