A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 荣天 中级黑马   /  2012-5-22 16:50  /  1582 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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?怎么计算的,麻烦说一下原理

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 杨尧 于 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
回复 使用道具 举报
StringBuffer的capacity() :返回当前StringBuffer对象(字符串缓冲区)的总空间,而非字符号串的长度。所以说capacity:34不是计算出来的。
回复 使用道具 举报
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
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
{:soso_e100:}   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马