2013-09-27 5 views
3

вот код из пункта 6, стр. 24, глава 2 эффективного java 2nd edition, Джошуа Блоха. В методе поп, который он определяет, он использует elements[--size]. Мне интересно, почему он использовал --size, вместо этого elements[size--] должен возвращать то же самое верно?Почему Джошуа Блох уменьшил значение «размера» стека в методе pop в эффективном java?

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); 
} } 
+1

В массивах используются индексы на основе 0. –

+3

выглядит так, будто есть утечка памяти - по нажатому элементу по-прежнему ссылается стек. – ZhongYu

+0

@ zhong.j.yu: да, утечка памяти может быть исправлена ​​путем ссылки на 'elements [size] == null' –

ответ

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 будет выброшен каждый раз, когда вы хотите, чтобы совать элемент из стек.

+0

Да, имеет смысл! –

+0

@ZouZou это почти идеально. «Таким образом, ArrayIndexOutOfBoundsException будет выбрасываться каждый раз, когда вы хотите вытащить элемент из стека». Это не совсем правильно. Предполагая, что исключение поймано и обработано в первый раз, в следующий раз будет уменьшаться размер, и он будет работать отсюда, но выкидывает пустое исключение стека, когда осталось еще один элемент. – Cruncher

+0

@Cruncher Спасибо за точность! =) Я предположил, что исключение не поймано, и выполнение программы будет остановлено. –

0

Простой ответ: минус-минус (или плюс плюс) действует перед итерацией, когда он приходит перед переменной, и после итерации, когда он приходит после переменной.

Например:

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

возвращается:

012 

В то время как:

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

возвращает:

123 

, потому что переменная x увеличивается до итерации.

+0

У этого вопроса нет итераций. Дело в том, что ++ x увеличивается до ОЦЕНКИ, а x ++ увеличивает ПОСЛЕ оценки. – Cruncher

+0

Это абсолютно неверно. Вы уже пробовали свой код? Оба дают 012. –

 Смежные вопросы

  • Нет связанных вопросов^_^