【问题标题】:How does the capacity of a StringBuffer increase? [duplicate]StringBuffer 的容量如何增加? [复制]
【发布时间】:2018-01-09 09:12:47
【问题描述】:

我尝试了 Java 中 StringBuffer 类的构造函数,但我对 StringBuffer(int initial) 构造函数的工作感到困惑。

我知道它为缓冲区提供了初始容量,但我怀疑,当提供的初始容量实际上小于对象的长度时,在这种情况下容量如何增加?

我尝试了两种情况,第一种情况:

StringBuffer str = new StringBuffer(11);
str.append("Hello World!");
System.out.println(str.length() + " " + str.capacity()); //prints 12 24

即容量变为字符串长度的两倍

第二个:

StringBuffer str = new StringBuffer(10);
str.append("Hello World!");
System.out.println(str.length() + " " + str.capacity()); //prints 12 22

即容量变为长度+初始缓冲容量

那么为什么缓冲区大小会如此不同的增加。在这两种情况下,初始容量都小于字符串长度,因此在两种情况下它都应该是长度的两倍,即变为 24,或者它加起来为初始缓冲区,在第一种情况下变为 23,在第一种情况下变为 22第二个。我也阅读了文档和其他各种博客,但我能找到的只是 StringBuffer 类的构造函数和函数的基本用法。

请帮帮我。谢谢。

【问题讨论】:

  • 旁注:在现代 Java 中,您应该使用 StringBuilder 而不是 StringBuffer
  • 这与如何分配新空间有关。它是当前分配空间的函数,在您的两个示例中都不相同
  • 好的。我还没有详细阅读它,所以当我阅读时,我会听从你的建议。但是因为我现在正在阅读 StringBuffer 所以问这个疑问:) @MickMnemonic
  • Java 类的源代码通常与 JDK 一起分发 - 应该可以在那里找到实现。
  • 我找到了一个答案,据说大小以 (previous capacity + 1) * 2 的方式增加,我可以理解它适用于增加的值可以容纳字符串的值。但我不认为它适用于增加值也不足以容纳字符串的值。

标签: java stringbuffer


【解决方案1】:

请参考StringBuffer和AbstractStringBuilder的源码:

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int newCapacity = (value.length << 1) + 2;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }
    return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
        ? hugeCapacity(minCapacity)
        : newCapacity;
}

请通过这些代码,你会得到它

对于第一个块,初始value.length = 11,(value.length &lt;&lt; 1) + 2 = 24; 对于第二块,初始value.length = 10,(value.length &lt;&lt; 1) + 2 = 22;

【讨论】:

  • ensureCapacity 的文档也应该有帮助...
  • 我现在明白了。阅读源代码。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多