黑马程序员技术交流社区

标题: 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