![](/img/trans.png)
[英]How to create an ensureCapacity method that deals with Array Generics in Java
[英]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
手柄不經有條件的( 0
到1
, 1
至3
, 3
至7
...)。 線索可以在評論中找到:
/**
* 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.