Почему Джошуа Блох уменьшил значение "size" стека в методе pop в эффективной java?
Вот код из пункта 6, стр. 24, глава 2 эффективного издания Java, 2-го издания Джошуа Блоха. В методе поп он определяет, он использует 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.
Представьте, что у вас есть стек с 2 элементами.
Таким образом, размер стека равен 2 со следующим представлением в массиве:
elements[0] = elem;
elements[1] = elem;
Таким образом, вам нужно уменьшить размер, прежде чем вытолкнуть элемент из стека, в противном случае вы попытаетесь вытолкнуть elements[2]
, которого не существует Так что в этом случае используется инфиксный оператор.
return elements[--size];
эквивалентно
size--;
return elements[size];
Если elements[size--];
было написано, он будет пытаться поп elements[2]
а затем уменьшить размер на 1. Так что ArrayIndexOutOfBoundsException
будет выбрасываться каждый раз, когда вы хотите извлечь элемент из стека.
Простой ответ - действия минус-минус (или плюс-плюс) до итерации, когда она идет перед переменной, и после итерации, когда она идет после переменной.
Например:
for(x=0; x<3; x++) {
System.out.print(x);
}
возвращает:
012
В то время как:
for(x=0; x<3; ++x) {
System.out.print(x);
}
возвращает:
123
потому что переменная x увеличивается до итерации.