黑马程序员技术交流社区
标题:
java StringBuffer无参构造函数 ?? 赐教原理 谢谢
[打印本页]
作者:
荣天
时间:
2012-5-20 08:44
标题:
java StringBuffer无参构造函数 ?? 赐教原理 谢谢
public class buffer {
public static void main(String[]args)
{
StringBuffer str = new StringBuffer();
str.append("大家好");
System.out.println("str:"+str);
System.out.println("length:"+str.length());
System.out.println("capacity:"+str.capacity());
str.append("大家好我们大家都很愿意学习Java语言");
System.out.println("str:"+str);
System.out.println("length:"+str.length());
System.out.println("capacity:"+str.capacity());
StringBuffer sb = new StringBuffer("hello");
System.out.println("length:"+sb.length());
System.out.println("capacity:"+sb.capacity());
}
}
str:大家好
length:3
capacity:16
str:大家好大家好我们大家都很愿意学习Java语言
length:22
capacity:34
length:5
capacity:21
为什么 会有capacity:34?怎么计算的,麻烦说一下原理
作者:
李保成
时间:
2012-5-20 09:00
本帖最后由 踩单车的幸福 于 2012-5-20 09:23 编辑
当使用capacity 来查看StringBuffer的容量时,首先确定一下StringBuffer有一个默认容量长度是16.
1、当你输入的值的长度小于当前容量时,容量不变。
2、当你输入的值的长度 大于当前容量,并且小于(当前容量+1)*2,则容量变为(当前容量+1)*2。
3、当你输入的值的长度 大于当前容量,并且大于(当前容量+1)*2,则容量变为用户所设置的容量。
作者:
李保成
时间:
2012-5-20 09:04
找了些资料看了下,差不多也是这个意思。就其原因是因为函数:ensureCapacity( )和 expandCapacity( )进行了控制
public synchronized void ensureCapacity( int minimumCapacity) {
if (minimumCapacity > value.length) {
// 当设置StringBuffer的容量小于当前容量时,容量不变。
expandCapacity(minimumCapacity);
}
}
private void expandCapacity( int minimumCapacity) {
int newCapacity = (value.length + 1 ) * 2 ;
if (newCapacity < 0 ) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
// 当设置StringBuffer的容量大于(当前容量+1)*2,则容量变为用户所设置的容量。
// 否则,容量为(当前容量+1)*2,即newCapacity
newCapacity = minimumCapacity;
}
char newValue[] = new char [newCapacity];
System.arraycopy(value, 0 , newValue, 0 , count);
value = newValue;
shared = false ;
}
作者:
任睦强
时间:
2012-5-20 09:12
java里面的方法的参数,只是把当前对象指向的地址给参数,
你的这个方法里
StringBuffer a=new StringBuffer("A");
//这一行,假设a指向了内存地址为4000的地方
StringBuffer b=new StringBuffer("B");
//这一行,假设b指向了内存地址为5000的地方
method(a,b);
//这个方法只是把a和b的地址传了过去。x指向4000,y指向5000,a与b还是指向原来的地址。
x.append(y);
//这句将a指向地址的内容变了。
y=x
//只是将y指向的地址发生变化,变为4000,而main程序中的b还指向5000
所以在main程序中输出时,还是B,因为那块内存的内容没有变化。
作者:
荣天
时间:
2012-5-20 10:00
谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2