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