StringBuilder容量方法

时间:2018-03-30 08:54:33

标签: java stringbuilder capacity

我一直在为Java OCA考试工作,只是注意到StringBuilder类有一个容量方法。在我阅读容量方法之前,一切都很好。它只是告诉Java为StringBuilder分配容量。但是,如果需要,Java可以增加StringBuilder的容量。 我要问的是,当Java需要更多的字符空间时,它可以自己提高StringBuilder的容量,为什么需要capacity()方法呢?

3 个答案:

答案 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的大小,它将创建该大小的内存并且您实现效率。