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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张硕 中级黑马   /  2012-11-20 22:14  /  1418 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

StringBuffer容器中有一个方法是capacity()的方法,是返回当前容量,哪位大神可以解释一下它的运行机制啊?为什么有时候我返回的是当前容量,而有时候返回的是值远远大于当前的容量呢?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 王震阳 于 2012-11-20 22:30 编辑

我来回答你吧,StringBuffer 初始化时会有一个默认大小的容量,它的底层数据结构是一个数组,当这个数组容量已经无法容纳下你的数据时,他会在创建一个容量为当前容量200%的容器,将这个新的容器替换掉那个老的容器,因此他的capacity()值时可以变化,当然在里面的值没有超过默认容量时,值时不变的。
给你代码和图片演示:
希望对你有帮助。
  1. public class A
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.             StringBuffer sb=new StringBuffer();
  6.                         int i=sb.capacity();
  7.                         while(true)
  8.                         {
  9.                                 sb.append('2');
  10.                                 if(i<sb.capacity())
  11.                                 {
  12.                                         i=sb.capacity();
  13.                                         System.out.println("当前capacity:"+sb.capacity());
  14.                                 }
  15.                                 
  16.                         }
  17.                         
  18.                                 
  19.         }
  20. }
复制代码

StringBuffer的capacity.jpg (103.75 KB, 下载次数: 33)

StringBuffer的capacity.jpg

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
那老的容器怎么处理呢?下次如果输入了在默认容器范围内的还用老的吗?
回复 使用道具 举报
张硕 发表于 2012-11-20 23:06
那老的容器怎么处理呢?下次如果输入了在默认容器范围内的还用老的吗?

老的容器已经成为内存中的垃圾,等待jvm回收了。StringBuffer 已经指向新的容器了。
回复 使用道具 举报
capacity()返回的是字符串缓冲区的容量

StringBuffer( ); /*分配16个字符的缓冲区*/  
StringBuffer( int len ); /*分配len个字符的缓冲区*/  
StringBuffer( String s ); /*除了按照s的大小分配空间外,再分配16个 字符的缓冲区*/  

你的StringBuffer是用字符构造的,"abc"的长度是3另外再分配16个字符,所以一共是19。
看了这个示例能够明白了吗?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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