字符串生成器如何替换工作?

How does string builder replace work?

    StringBuilder sbt = new StringBuilder(2);//
    System.out.print(sbt+"G");
    sbt.replace(0,2,"Mano");
    System.out.println(sbt+"Length is:"+sbt.capacity());

我希望它应该打印 GManoLength is:4.

但是returnsGManoLength is:6

这个分配是如何工作的?

我读了this

StringBuilder 将数据保存在 char[] 数组中,capacity() 方法 returns 这个数组的长度(不是附加值的长度)。

当达到容量并且您想附加更多值时,应扩展数组。在此过程中提供额外的 space 并且不要在每次附加后进行扩展(这是昂贵的操作)是一个好主意:

int newCapacity = value.length * 2 + 2;//called when capacity is reached during append

所以capacity总是大于等于那么实际数据的长度(这个值可以调用length()方法得到)

您没有显示 StringBuilder 内容的 长度 。您显示的是 容量。 StringBuilder 可以根据需要分配任意多的 space,即使您从不使用 space。通常,假设 StringBuilder 将用于向其中添加更多数据是明智之举,否则您将使用 String 或其他恒定大小构造。

如果要显示数据的长度,请使用length()方法。

当您尝试将这 4 个字符 "Mano" 添加到容量为 2 的 StrigBuilder 时,将使用 minimumCapacity 作为分配新字符串所需的最小大小调用 AbstractStringBuilder 的 expandCapacity 方法:

void expandCapacity(int minimumCapacity) {
    int newCapacity = value.length * 2 + 2;
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity);
}

它尝试做的第一件事是将当前容量加倍并求和 2。您的原始容量为 2,因此 newCapacity 将为 6。这大于 4("Mano" 的长度) 所以这就是你看到 6.

的原因