簡體   English   中英

有效的Java:sureCapacity()方法

[英]Effective Java: ensureCapacity() method

布洛赫(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?

堆棧已滿時,他正在將堆棧的大小加倍。

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),這與固定大小的數組具有相同的復雜度,而不必處理復制成本。

如果您想看到一個證明和直觀地解釋這個奇妙想法的方法,請觀看第41分鍾的Skiena教授的講座

因為否則,您將需要特別處理空情況:如果您總是將容量加倍,則不可能從空數組到1元素數組。 當然,您可以執行“如果size為0 ,則為1 ;否則為2 * size ”; 2 * size + 1手柄不經有條件的( 011337 ...)。 線索可以在評論中找到:

/**
 * Ensure space for at least one more element, roughly
 * doubling the capacity each time the array needs to grow.
 */

(無論size如何,“至少還有一個元素”)。

這行中的“舊對象”(數組中的元素)被復制到新數組中:

elements = Arrays.copyOf(elements,2 * size +1); 至於舊的元素數組,由於不再有指向它的引用,它最終將被垃圾回收。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM