代码之家  ›  专栏  ›  技术社区  ›  brain storm

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

  •  3
  • brain storm  · 技术社区  · 11 年前

    这是Joshua Bloch的有效java第二版第2章第24页第6项中的代码。 在他定义的流行方法中,他使用 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 回复  |  直到 5 年前
        1
  •  11
  •   Alexis C.    11 年前

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

    想象一下,您有一个包含2个元素的堆栈。

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

    elements[0] = elem;
    elements[1] = elem;
    

    因此,在从堆栈中弹出elem之前,您需要减小大小,否则您将尝试弹出 elements[2] ,但不存在。所以在这种情况下使用了一个中缀运算符。

    return elements[--size];
    

    相当于

    size--;
    return elements[size];
    

    如果 elements[size--]; 是写的,它会试图弹出 元素[2] 然后将大小减小1。所以 ArrayIndexOutOfBoundsException 每次您想从堆栈中弹出一个元素时都会抛出。

        2
  •  -1
  •   DrMavenRebe    11 年前

    简单的答案是,减号(或加号)在迭代之前(当它出现在变量之前时)和迭代之后(当它发生在变量之后时)起作用。

    例如:

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

    退货:

    012
    

    同时:

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

    退货:

    123
    

    因为x变量在迭代之前递增。