字符串生成器容量()

2022-09-02 20:03:27

我注意到该方法在没有逻辑方式的情况下返回容量...有时它的值等于字符串长度,其他时间它更大...capacityStringBuilder

有没有一个方程式知道哪个是它的逻辑?


答案 1

当您追加到 时,将发生以下逻辑:StringBuilder

if (newCount > value.length) {
    expandCapacity(newCount);
}

其中 是所需的字符数,并且是缓冲区的当前大小。newCountvalue.length

expandCapacity只需增加背衬的尺寸char[]

该方法是公共调用方式,其文档说:ensureCapacity()expandCapacity()

确保容量至少等于指定的最小值。如果当前容量小于参数,则为新的内部阵列分配更大的容量。新容量是以下较大容量:

  • 最小容量参数。
  • 是旧容量的两倍,外加 2。

如果 minimumCapacity 参数是非正数,则此方法不执行任何操作,而只是返回。


答案 2

我将尝试用一些例子来解释这一点。

public class StringBuilderDemo {
     public static void main(String[] args) {
         StringBuilder sb = new StringBuilder();
         System.out.println(sb.length());
         System.out.println(sb.capacity());
     }
}

length()- 生成器中字符序列的长度,因为此字符串生成器不包含任何内容,因此其长度将为 0。

capacity()- 已分配的字符空间数。当您尝试构造具有空内容的字符串生成器时,默认情况下,它将初始化大小为 length+16,即 0+16。所以容量会在这里返回16。

注意:由 capacity() 方法返回的容量始终大于或等于长度(通常大于),并且将根据需要自动扩展以适应字符串生成器的添加。

容量函数背后的逻辑:

  1. 如果不使用任何内容初始化字符串生成器,则默认容量将被视为 16 个字符的容量。
  2. 如果使用任何内容初始化字符串生成器,则容量将为内容长度+16。
  3. 当您向 stringbuilder 对象添加新内容时,如果当前容量不足以获取新值,则它将增长(以前的阵列容量+1)*2。

此分析取自实际的 StringBuilder.java代码


推荐