Почему Джошуа Блох уменьшил значение "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 увеличивается до итерации.

Другие вопросы по тегам