Java StringBuffer类中的ensureCapacity(int minimumCapacity)方法

Java StringBuffer类中的ensureCapacity(int minimumCapacity)方法,java,stringbuffer,Java,Stringbuffer,根据oracle文档,请参阅此链接 我试图用一个代码示例来清除它: 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 Cap

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

我试图用一个代码示例来清除它:

    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?

我确信答案将是vm的实现细节,但是

比如说

AbstractStringBuilder

void expandCapacity(int最小容量){
int newCapacity=(value.length+1)*2;
如果(新容量<0){
newCapacity=Integer.MAX_值;
}否则如果(最小容量>新容量){
新容量=最小容量;
}
value=Arrays.copyOf(value,newCapacity);
}

但我看它不会再回来了。所以更多的代码探索。是必需的(这也是openjdk源代码。不确定哪些内容已更改或与您的vm不同

我确信答案将是vm的实现细节,但是

比如说

AbstractStringBuilder

void expandCapacity(int最小容量){
int newCapacity=(value.length+1)*2;
如果(新容量<0){
newCapacity=Integer.MAX_值;
}否则如果(最小容量>新容量){
新容量=最小容量;
}
value=Arrays.copyOf(value,newCapacity);
}

但是我没有看到它返回55。因此需要更多的代码探索(这也是openjdk源代码。不确定有什么更改或与您的vm不同,我相信答案将是vm的实现细节,但是

比如说

AbstractStringBuilder

void expandCapacity(int最小容量){
int newCapacity=(value.length+1)*2;
如果(新容量<0){
newCapacity=Integer.MAX_值;
}否则如果(最小容量>新容量){
新容量=最小容量;
}
value=Arrays.copyOf(value,newCapacity);
}

但是我没有看到它返回55。因此需要更多的代码探索(这也是openjdk源代码。不确定有什么更改或与您的vm不同,我相信答案将是vm的实现细节,但是

比如说

AbstractStringBuilder

void expandCapacity(int最小容量){
int newCapacity=(value.length+1)*2;
如果(新容量<0){
newCapacity=Integer.MAX_值;
}否则如果(最小容量>新容量){
新容量=最小容量;
}
value=Arrays.copyOf(value,newCapacity);
}

但是我看不到它返回55。因此需要更多的代码探索(这也是openjdk源代码。不确定有什么更改或与您的vm不同,这是由于调用了
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);
}
void expandCapacity(int最小容量){
int newCapacity=value.length*2+2;
if(新容量-最小容量<0)
新容量=最小容量;
如果(新容量<0){
if(最小容量<0)//溢出
抛出新的OutOfMemoryError();
newCapacity=Integer.MAX_值;
}
value=Arrays.copyOf(value,newCapacity);
}
因此,当它增加容量时,它会将容量至少增加(2*原始容量)+2,以提供的值为准,以较大者为准

如果容量为26,且通过30:

(26*2)+2=54,大于30,因此新容量为54

如果容量为26,您通过55:


(26*2)+2=54,这小于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);
}
void expandCapacity(int最小容量){
int newCapacity=value.length*2+2;
if(新容量-最小容量<0)
新容量=最小容量;
如果(新容量<0){
if(最小容量<0)//溢出
抛出新的OutOfMemoryError();
newCapacity=Integer.MAX_值;
}
value=Arrays.copyOf(value,newCapacity);
}
因此,当它增加容量时,它会将容量至少增加(2*原始容量)+2,以提供的值为准,以较大者为准

如果容量为26,且通过30:

(26*2)+2=54,大于30,因此新容量为54

如果容量为26,您通过55:


(26*2)+2=54,这小于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);
}
void expandCapacity(int最小容量){
int newCapacity=value.length*2+2;
if(新容量-最小容量<0)
新容量=最小容量;
如果(新容量<0){
if(最小容量<0)//溢出
抛出新的OutOfMemoryError();
newCapacity=Integer.MAX_值;
}
value=Arrays.copyOf(value,newCapacity);
}
因此,当它增加容量时,它会将容量至少增加(2*原始容量)+2,以提供的值为准,以较大者为准

如果容量为26,且通过30:

(26*2)+2=54,大于30,因此新容量为54

如果容量为26,您通过55:


(26*2)+2=54,这小于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);
}
<