2010-11-27 62 views
0

我有一些關於數組的問題,我正在讀一些關於Java的書,現在我正在閱讀關於類StringBuilder的知識,我被教導說這個類將當前容量保存在數組中,容量不足,這個班級自動增加容量capacity = 2*(capacity + 1),當我學習c和C++時,如果我的陣列中沒有足夠的空間,我被教導要做同樣的事情,但爲什麼我不能找出多少內存,我需要,然後做capacity = capacity + homMuchDoINeed(),或者爲什麼不capacity = 4 * capacity,在此先感謝您的答案附加一個已存在的數組

回答

2

,爲什麼我就不能找出多少內存,我需要,然後做

capacity = capacity + homMuchDoINeed()

因爲那麼你需要與每個插入分配新的內存,所以一次插入需要線性時間,而n次插入需要二次時間。另一方面,如果你增長一個像x2或x1.5這樣的常數因子,單次插入需要分攤恆定時間,並且n次插入需要線性時間。

Stephan T. Lavavej在多個視頻中對此進行了說明,例如this one

0

capacity = C * (capacity + K)通常優於capacity = capacity + K,因爲您不必經常重新分配,並且capacity = C * capacity根本不可行(如果當前容量爲0,該怎麼辦?)。

但是,如果可能,我建議您使用standard containers

1

自動增加只是一個經驗法則,以最大限度地減少對象的構造。

如果您知道將追加多少個元素,並且未來不會再添加元素,則最好明確指定大小以節省內存。在Java中,你可以做到這一點有:

Arrays.copyOf(oldArray,新尺寸)

如果你不知道,沒有更多的元素將被添加到陣列中,在Java中你可以只使用ArrayList,因爲它使用這個經驗法則透明地處理調整大小:

int newCapacity =(oldCapacity * 3)/ 2 + 1;

0

如果您知道需要多少容量,則可以在啓動時提供集合的容量。倍增代碼假定你不知道你最終需要多少內存(或者至少不需要擔心)

相關問題