【问题标题】:StringBuilder capacity method [duplicate]StringBuilder容量方法[重复]
【发布时间】:2018-03-30 08:54:33
【问题描述】:
我一直在为 Java OCA 考试工作,只是注意到 StringBuilder 类有一个容量方法。在我阅读有关容量方法之前,一切都很好。它只是告诉 Java 为 StringBuilder 分配容量。但如果需要,Java 可以增加 StringBuilder 的容量。
我要问的是,当Java需要更多的字符空间时,它可以自己提高StringBuilder的容量,为什么需要容量()方法?
【问题讨论】:
标签:
java
stringbuilder
capacity
【解决方案1】:
通常,Java 会随着字符串的增长分配容量,但这可能需要多次重新分配内存(如果您正在逐段构建大字符串),这会给垃圾收集器带来一些开销。
如果你已经知道你最终需要的大小,你可以预先分配足够的内存开始,然后你就只有一个分配。
重新分配的公式是:
int newCapacity = (value.length + 1) * 2;
因此,通常每次 StringBuilder 空间不足时容量都会增加一倍。默认容量为 16,因此,例如,如果您需要构建一个 1k 的字符串,则需要进行相当多 (6) 次重新分配才能到达那里。
同样的策略也适用于集合类。
【解决方案2】:
我要问的是,当 Java 需要更多的字符空间时
可以自己提高StringBuilder的容量,为什么容量()
需要方法吗?
由于StringBuilder 的大小超过了实际容量,所以实际上是这样做的。
capacity() 指定为:
返回当前容量。容量是存储量
可用于新插入的字符,超出该字符的分配
会发生。
您可以将其视为StringBuilder(以及AbstractStringBuilder 实例通常定义为capacity())的客户更精细地控制当前StringBuilder 实例的实际状态的一种方式。
例如,它可以用于优化ensureCapacity(int minimumCapacity) 的下一次调用以仅分配所需的内容。
【解决方案3】:
为了回答你的问题,我想让你看看 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 的大小,它将创建该大小的内存并达到效率。