java - StringBuffer 类中的 EnsureCapacity(intminimumCapacity) 方法

标签 java stringbuffer

根据 oracle 文档,请参阅此链接 here

public void ensureCapacity(int minimumCapacity)

Ensures that the capacity is at least equal to the specified minimum. 
If the current capacity is less than the argument, then a new internal array 
is allocated with greater capacity. 

The new capacity is the larger of:
The minimumCapacity argument.
Twice the old capacity, plus 2.
If the minimumCapacity argument is nonpositive, this method takes no action and simply returns.

我正在尝试使用代码示例清除它:

    StringBuffer buff1 = new StringBuffer("tuts point");
    System.out.println("buffer1 = " + buff1);        // lenght = 10

    // returns the current capacity of the string buffer 1
    System.out.println("Old Capacity = " + buff1.capacity());  // capacity = 16+10=26 characters
    /*
     * increases the capacity, as needed, to the specified amount in the
     * given string buffer object
     */
    // returns twice the capacity plus 2
    buff1.ensureCapacity(30);
    System.out.println("New Capacity = " + buff1.capacity()); // 26*2 + 2 = 54

如果ensureCapacity方法中的minimumCapacity参数在27 - 53之间,那么我确实得到了预期的答案(返回两倍的容量加上2)。 但是,如果参数>=55,则容量仅等于该参数。

    // does not return (twice the capacity plus 2)
    buff1.ensureCapacity(55);
    System.out.println("New Capacity = " + buff1.capacity());  // 55

为什么这里的答案是 55?

最佳答案

这是由于对 AbstractStringBuilder 类的调用造成的:

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,达到提供的值,以较大者为准。

如果容量为 26,而您传递了 30:

(26 * 2) + 2 = 54,这超过了 30,因此新容量将为 54。

如果容量为 26,而您传递了 55:

(26 * 2) + 2 = 54,这小于 55,因此新容量将为 55。

关于java - StringBuffer 类中的 EnsureCapacity(intminimumCapacity) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404043/

相关文章:

java - Java中使用TCP连接向多个客户端广播

java - 静态方法的泛型

java - 在 Java 中将 StringBuffer 转换为字节数组

java - 如何在 java 中删除字符串缓冲区的最后一个字符?

java - 有没有办法将文件的 1/4 写入字符串缓冲区?

java - 调用 Setter 方法时自定义对话框 fragment 崩溃

java - Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties

java - 如何为这些类型的方法编写单元测试?

java - stringbuffer 和 "0&"导致截断或转义

java - java中屏蔽XML标签值的问题