我有一些关于数组的问题,我正在阅读一些关于Java的书,现在我正在阅读关于类StringBuilder的内容,我被告知这个类将我的字符串保存在具有当前容量的数组中,如果容量是还不够,这个类自动增加容量capacity = 2*(capacity + 1)
,当我学习c和c ++时,如果我的数组中没有足够的空间,我被教导做同样的事情,但what is the logic behind this statement?
为什么可以我只是想知道我需要多少记忆然后再做capacity = capacity + homMuchDoINeed()
,或者为什么不capacity = 4 * capacity
,先谢谢你的回答
答案 0 :(得分:2)
为什么我不能只知道我需要多少内存然后再做
capacity = capacity + homMuchDoINeed()
因为那时你需要为每次插入分配新的内存,所以单个插入需要线性时间,n次插入需要二次时间。另一方面,如果你以x2或x1.5之类的常数因子增长,则单个插入需要按照摊销的常数时间进行,n次插入需要线性时间。
Stephan T. Lavavej在多个视频中解释了这一点,例如this one。
答案 1 :(得分:1)
自动增加只是一个经验法则,以尽量减少对象构建。
如果您知道将追加多少个元素,并且将来不再添加任何元素,最好明确指定大小以节省内存。在Java中,您可以使用:
Arrays.copyOf(oldArray,newSize)
如果您不确定不会再将更多元素附加到数组中,那么在java中您可以使用ArrayList,因为它使用此经验法则透明地处理调整大小:
int newCapacity =(oldCapacity * 3)/ 2 + 1;
答案 2 :(得分:0)
只需使用ArrayList
答案 3 :(得分:0)
capacity = C * (capacity + K)
通常比capacity = capacity + K
更好,因为您不必经常重新分配,capacity = C * capacity
根本不可行(如果当前容量为0,会怎样?)。< / p>
但是,如果可能,我建议您使用standard containers。
答案 4 :(得分:0)
如果您知道需要多少容量,则可以在启动时提供收集容量。加倍代码假设您不知道最终需要多少内存(或者至少不想担心它)