有效的Java:ensureCapacity()方法

时间:2016-05-06 05:48:11

标签: java

在Bloch写的书中写道:

class Stack{
    private Object[] elements;

    // Code omitted

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    // Ensure space for at least one more element
    private void ensureCapacity() {
        if (elements.length==size) {
            elements = Arrays.copyOf(elements, 2*size + 1);
        }
    }
}

他为什么要使用

  

2 *大小+ 1

将数组的大小增加1?

3 个答案:

答案 0 :(得分:2)

当堆栈变满时,它的大小加倍。

0 - > 2 * 0 + 1 = 1

1 - > 1 * 2 + 1 = 3

3 - > 3 * 2 + 1 = 7

7 - > 7 * 2 + 1 = 15

这是动态数组的功能。通过在每次达到最大容量时加倍,可以减少在空间不足时复制整个阵列的大复杂性。

在数据结构中存储n个元素所花费的时间是O(2n),它实际上是O(n),它与固定大小的数组相同,不需要处理复制成本。

如果您希望看到这个奇妙想法的证明和直观解释,请观看lecture by Prof. Skiena from the 41 minute mark

答案 1 :(得分:0)

因为否则你需要专门处理空案例:如果你总是加倍容量,那么从空数组到单元素数组是不可能的。当然,您可以“如果尺寸为string filePath=@"C:\sample.txt"; // or something like this string[] lines=System.IO.File.ReadAllLines(filePath); ,则为0;否则为1”;但2 * size处理它时没有条件(2 * size + 101133 ...... )。线索可以在评论中找到:

7

(“至少还有一个元素”,无论/** * Ensure space for at least one more element, roughly * doubling the capacity each time the array needs to grow. */ 是什么)。

答案 2 :(得分:0)

"旧物品" (数组中的元素)将被复制到此行中的新数组中:

elements = Arrays.copyOf(elements,2 * size + 1); 至于旧的元素数组,它最终会被垃圾收集,因为没有更多的引用指向它。