StringBuffer str = new StringBuffer();
str.append("大家好我们大家都很愿意学习java语言");
System.out.println("length:"+str.length()); //返回19,因为初始化的16个字符空间已经不够,这时会自动扩容
System.out.println("Capacity:"+str.capacity()); //返回34那么这个str.capacity()为34是如何得出的呢??查了api也只是草草地说这个方法是“返回当前容量”的意思。希望各位高手能对这个方法进行详细,只要说出这34是如何得出的就行了,谢谢
str.append("大家好我们大家都很愿意学习java语言");
System.out.println("length:"+str.length()); //返回19,因为初始化的16个字符空间已经不够,这时会自动扩容
System.out.println("Capacity:"+str.capacity()); //返回34那么这个str.capacity()为34是如何得出的呢??查了api也只是草草地说这个方法是“返回当前容量”的意思。希望各位高手能对这个方法进行详细,只要说出这34是如何得出的就行了,谢谢
不过这种问题就算知道了也没多大意义吧。# /**
# * This implements the expansion semantics of ensureCapacity with no
# * size check or synchronization.
# */
# void expandCapacity(int minimumCapacity) {
# int newCapacity = (value.length + 1) * 2;
# if (newCapacity < 0) {
# newCapacity = Integer.MAX_VALUE;
# } else if (minimumCapacity > newCapacity) {
# newCapacity = minimumCapacity;
# }
# char newValue[] = new char[newCapacity];
# System.arraycopy(value, 0, newValue, 0, count);
# value = newValue;
# }
/**
* The value is used for character storage.
*/
char value[]; /**
* The count is the number of characters used.
*/
int count; public synchronized int length() {
return count;
}
public synchronized int capacity() {
return value.length;
}
源码如上面所示:
可知:
length返回的字符的个数
capacity返回的是储存字符所需的字节数
如果说是new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
1)new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
答:s.length() + 16,然后再append(s);2)new StringBuffer();
答:16。
那么:append(s);是如何扩容的呢?其实4楼的代码已经说得很清楚了。
思想是:最小容量是:当前的长度+串长,拟扩充的新容量是:(旧容量+1)*2
若:最小容量>拟扩充的新容量,则按最小容量扩充,否则(拟扩充的新容量>=最小容量):就按拟扩充的新容量扩充。楼主的第一次串:
StringBuffer str = new StringBuffer(); //容量是16
str.append("大家好我们大家都很愿意学习java语言"); //扩容。如何扩?
最小容量是:0(当前长度是0)+19(那个要append的串长)=19
拟扩充的新容量:(16+1)*2=34
因为:最小容量<拟扩充的新容量,则此时按:拟扩充的新容量即34进行扩容。
楼主的第二次串:
StringBuffer str = new StringBuffer(); //容量是16
str.append("我们大家都很愿意学习java语言zzzzzzzzzzzzzzzzzzzz"); //扩容。如何扩?最小容量是:0(当前长度是0)+36(那个要append的串长)=36
拟扩充的新容量:(16+1)*2=34
因为:最小容量>拟扩充的新容量,则此时按:最小容量即36进行扩容。