黑马程序员技术交流社区

标题: StringBuffer的无参构造函数 - [打印本页]

作者: 荣天    时间: 2012-5-22 16:50
标题: StringBuffer的无参构造函数 -
  1. public class buffer {
  2. public static void main(String[]args)
  3. {
  4.   StringBuffer str = new StringBuffer();
  5.   str.append("大家好");
  6.   System.out.println("str:"+str);
  7.   System.out.println("length:"+str.length());
  8.   System.out.println("capacity:"+str.capacity());
  9.   str.append("大家好我们大家都很愿意学习Java语言");
  10.   System.out.println("str:"+str);
  11.   System.out.println("length:"+str.length());
  12.   System.out.println("capacity:"+str.capacity());
  13.   StringBuffer sb = new StringBuffer("hello");
  14.   System.out.println("length:"+sb.length());
  15.   System.out.println("capacity:"+sb.capacity());
  16. }

  17. }
复制代码
str:大家好
length:3
capacity:16
str:大家好大家好我们大家都很愿意学习Java语言
length:22
capacity:34
length:5
capacity:21 为什么 会有capacity:34?怎么计算的,麻烦说一下原理

作者: 8161776    时间: 2012-5-22 17:32
本帖最后由 杨尧 于 2012-5-22 17:35 编辑
  1. public class buffer {
  2. public static void main(String[]args)
  3. {
  4.   StringBuffer str = new StringBuffer();
  5.   str.append("大家好");
  6.   System.out.println("str:"+str);
  7.   System.out.println("length:"+str.length());
  8.   System.out.println("capacity:"+str.capacity());
  9.   str.append("大家好我们大家都很愿意学习Java语言");
  10.   System.out.println("str:"+str);
  11.   System.out.println("length:"+str.length());
  12.   System.out.println("capacity:"+str.capacity());
  13.   StringBuffer sb = new StringBuffer("hello");
  14.   System.out.println("length:"+sb.length());
  15.   System.out.println("capacity:"+sb.capacity());
  16. }

  17. }
复制代码

容量指可用于最新插入的字符的存储量,超过这一容量就需要再次进行分配。
超过的话分配一点,增加的规律是(旧值+1)*2
作者: 陆建平    时间: 2012-5-22 17:43
StringBuffer的capacity() :返回当前StringBuffer对象(字符串缓冲区)的总空间,而非字符号串的长度。所以说capacity:34不是计算出来的。
作者: 张晨    时间: 2012-5-22 18:10
StringBuffer 初始能容纳16个字符
  1. public StringBuffer() {
  2.         super(16);
  3.     }
复制代码
若超过长度,会自动调用如下方法:
  1.    */
  2.     void expandCapacity(int minimumCapacity) {
  3.         int newCapacity = value.length * 2 + 2;
  4.         if (newCapacity - minimumCapacity < 0)
  5.             newCapacity = minimumCapacity;
  6.         if (newCapacity < 0) {
  7.             if (minimumCapacity < 0) // overflow
  8.                 throw new OutOfMemoryError();
  9.             newCapacity = Integer.MAX_VALUE;
  10.         }
  11.         value = Arrays.copyOf(value, newCapacity);
  12.     }
复制代码
也就是说他的新长度=旧长度×2+2;

测试一下:
  1. package test;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 StringBuffer sb = new StringBuffer();
  5.                
  6.                 System.out.println(sb.capacity() );
  7.                
  8.                 sb.append("01234567890123456790");
  9.                 System.out.println(sb.capacity() );
  10.         }

  11. }
复制代码
output:
  1. 16
  2. 34
复制代码

作者: 荣天    时间: 2012-5-22 20:23
{:soso_e100:}   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2