StringBuilder容量()

xde*_*000 15 java stringbuilder capacity

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

知道哪个是逻辑的等式?

Boz*_*zho 13

附加到StringBuilder,会发生以下逻辑:

if (newCount > value.length) {
    expandCapacity(newCount);
}
Run Code Online (Sandbox Code Playgroud)

where newCount所需的字符数,value.length是缓冲区的当前大小.

expandCapacity 只是增加了背衬的大小 char[]

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

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

  • minimumCapacity参数.
  • 旧容量的两倍加2.

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

  • 是的,但如果我有:StringBuilder str = new StringBuilder(); // capacity 16 str.append("1111111111111111111"); 容量32长度19根据等式,为什么容量不是16*2 + 2 = 34? (3认同)

use*_*551 12

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

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

length() - 构建器中字符序列的长度,因为此stringbuilder不包含任何内容,其长度将为0.

capacity() - 已分配的字符空间数.当您尝试构造具有空内容的stringbuilder时,默认情况下,它将初始化大小设为length + 16,即0 + 16.因此容量将在这里返回16.

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

容量函数背后的逻辑:

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

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


Ins*_*ere 5

此函数执行的操作与您预期的不同 - 它为您提供此 StringBuilder 实例内存此时可以容纳的最大字符数。

字符串生成器必读