我一直在为Java OCA考试工作,只是注意到StringBuilder类有一个容量方法。在我阅读容量方法之前,一切都很好。它只是告诉Java为StringBuilder分配容量。但是,如果需要,Java可以增加StringBuilder的容量。 我要问的是,当Java需要更多的字符空间时,它可以自己提高StringBuilder的容量,为什么需要capacity()方法呢?
答案 0 :(得分:2)
通常,Java会在字符串增长时分配容量,但这可能需要多次重新分配内存(如果要逐块构建一个大字符串),这会为垃圾收集器带来一些开销。
如果你已经知道最终需要的大小,你可以预先分配足够的内存来开始,然后你只有一个分配。
重新分配的公式是:
int newCapacity = (value.length + 1) * 2;
因此,每次StringBuilder空间不足时,容量通常会加倍。默认容量为16,因此,例如,如果您需要构建1k字符串,则需要进行相当多的(6)重新分配才能实现。
同样的策略也适用于集合类。
答案 1 :(得分:0)
我要问的是,当Java需要更多空间来填充字符时 可以自己提高StringBuilder的容量,为什么容量() 方法需要吗?
由于StringBuilder
的大小超过实际容量,实际上是完成的。
capacity()
指定为:
返回当前容量。容量是存储量 可用于新插入的字符,超出分配范围 会发生。
您可以将其视为StringBuilder
(和AbstractStringBuilder
个实例的客户端的一种方式,因为capacity()
已定义)以更精细地控制当前StringBuilder
的实际状态1}}实例。
例如,它可以用于优化ensureCapacity(int minimumCapacity)
的下一次调用,以仅分配所需的内容。
答案 2 :(得分:-1)
要回答您的问题,我希望您查看hashmap或ArrayList类
**
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
//...
}
由于arraylist是可调整大小的,但如果你没有定义元素的数量,它们在内部有一些大小,那么它将创建一个大小为10的数组,即DEFAULT_CAPACITY = 10;
因此,如果超过10,它将调整大小并创建另一个具有更大大小的数组并放置先前的值,但如果在此之前声明ArrayList的大小,它将创建该大小的内存并且您实现效率。