黑马程序员技术交流社区

标题: StringBuffer的疑问 [打印本页]

作者: 张硕    时间: 2012-11-20 22:14
标题: StringBuffer的疑问
StringBuffer容器中有一个方法是capacity()的方法,是返回当前容量,哪位大神可以解释一下它的运行机制啊?为什么有时候我返回的是当前容量,而有时候返回的是值远远大于当前的容量呢?

作者: 王震阳老师    时间: 2012-11-20 22:23
本帖最后由 王震阳 于 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

作者: 张硕    时间: 2012-11-20 23:06
那老的容器怎么处理呢?下次如果输入了在默认容器范围内的还用老的吗?
作者: 王震阳老师    时间: 2012-11-20 23:24
张硕 发表于 2012-11-20 23:06
那老的容器怎么处理呢?下次如果输入了在默认容器范围内的还用老的吗?

老的容器已经成为内存中的垃圾,等待jvm回收了。StringBuffer 已经指向新的容器了。
作者: jerry2627    时间: 2012-11-21 02:53
capacity()返回的是字符串缓冲区的容量

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

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




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