当前位置: 首页 > 工具软件 > Joshua > 使用案例 >

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

佴英奕
2023-12-01

这是Joshua Bloch撰写的第6章第24页的有效Java第2版第2章的代码.

在他定义的pop方法中,他使用元素[ – size].我想知道他为什么使用–size,而元素[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);

} }

解决方法:

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

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

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

elements[0] = elem;

elements[1] = elem;

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

return elements[--size];

相当于

size--;

return elements[size];

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

标签:java,stack,effective-java,pop

来源: https://codeday.me/bug/20190716/1478286.html

 类似资料: