黑马程序员技术交流社区

标题: 关于StringBuffer的一个问题 [打印本页]

作者: 田建    时间: 2012-6-23 18:56
标题: 关于StringBuffer的一个问题
本帖最后由 田建 于 2012-6-24 10:51 编辑

回头复习的时候,一个小知识点想不通了,麻烦解答下!
当我将StringBuffet的容量设置为30之后,只能装得下原字符串的一部分,但是打印出的StringBuffer的容量仍是55,不知为何;
我然后查了API文档,解释为:容量指可用于最新插入的字符的存储量!还是不太理解:代码如下:
  1. class TestSetLength
  2. {
  3. public static void main(String[] args)
  4. {
  5. StringBuffer sb=new StringBuffer("it is a far,far better thing that i do!");
  6. System.out.println("sb="+sb);
  7. System.out.println("sb.length()="+sb.length());
  8. System.out.println("sb.capacity()="+sb.capacity());
  9. sb.setLength(30);
  10. System.out.println("sb="+sb);
  11. System.out.println("sb.length()="+sb.length());
  12. System.out.println("sb.capacity()="+sb.capacity());

  13. }
  14. }
复制代码

作者: 王晓新    时间: 2012-6-23 19:39
StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。
假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。
作者: 王广丛    时间: 2012-6-23 19:44
capacity即容量是这个对象本身能够容纳的字符数量,而StringBuffer中的length属性是指,实际存入的字符的数量。容量一旦设立就是固定的,不会随着你实际放入的数量而改变。举个例子来说:
比如说一个水桶,他的容量是3L,然而你实际上加了1L的水,现在你要从中倒掉0.5L水,实际装的水减少了,但是它的容量是不变的依然是3L。希望能帮到你理解
作者: 常佳杰    时间: 2012-6-23 20:28
解释:
StringBuffer( String s ); //除了按照s的大小分配空间外,再分配16个字符的缓冲区
你的StringBuffer是用字符构造的,
"it is a far,far better thing that i do!"的长度是39另外再分配16个字符共55,
所以字符串缓冲区的容量为55,
后边你改的是它的长度,改不了容量的(除非你的字符串长度超过55....)所以输出的容量仍然是55.
要是写成这样的话:
StringBuffer sb=new StringBuffer("it is a far,far better thing that i do!");
System.out.println("sb="+sb);
System.out.println("sb.length()="+sb.length());
System.out.println("sb.capacity()="+sb.capacity());
sb.append("dasdfghjklkjhgfds");
System.out.println("sb="+sb);
System.out.println("sb.length()="+sb.length());
System.out.println("sb.capacity()="+sb.capacity());

输出结果是:
sb=it is a far,far better thing that i do!
sb.length()=39
sb.capacity()=55
sb=it is a far,far better thing that i do!dasdfghjklkjhgfds
sb.length()=56
sb.capacity()=112

当超过55的话它的缓冲区容量就编程56的2倍了..
作者: 张华廷    时间: 2012-6-23 23:38
楼上哥们分析的很是透彻,赞一个
作者: 田建    时间: 2012-6-24 07:46
常佳杰 发表于 2012-6-23 20:28
解释:
StringBuffer( String s ); //除了按照s的大小分配空间外,再分配16个字符的缓冲区
你的StringBuffer ...

我的意思是既然它的capacity是55,为什么会容不下39的长度呢?
作者: 常佳杰    时间: 2012-6-24 09:16
怎么会容不下39的长度呢?
StringBuffer sb=new StringBuffer("it is a far,far better thing that i do!");
System.out.println("sb.length()="+sb.length());
打印结果是:sb.length()=39
到里边加个字符  sb.append("j");
它的长度是不是40了? 超过了39..
你再打印它的长度和容量:
System.out.println("sb.length()="+sb.length());
System.out.println("sb.capacity()="+sb.capacity());
结果:
sb.length()=40
sb.capacity()=55
容量还是55,这个说明了它的长度可以为40了..
哥们这个理解了吗?


作者: 田建    时间: 2012-6-24 09:35
常佳杰 发表于 2012-6-24 09:16
怎么会容不下39的长度呢?
StringBuffer sb=new StringBuffer("it is a far,far better thing that i do!") ...

但是在我setLength=30之后,它的capacity还是55,但是装进去的只有30了,这是?!
作者: 常佳杰    时间: 2012-6-24 10:01
后边你改的是它的长度,改不了容量的(除非你的字符串长度超过55....)所以输出的容量仍然是55.

上边说过的问题,希望好好看...
作者: rslheima    时间: 2012-6-24 10:14
setLength() 方法是设置字符序列的长度,操作对象是字符串
sb.setLength(30);该序列将被更改为一个的字符序列,新序列的长度是30,
结果:sb=it is a far,far better thing t 长度就是30
---------------------------------------------------
而sb.capacity()是返回缓冲区的容量
作者: 田建    时间: 2012-6-24 10:51
多谢各位的耐心解答!




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