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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-6-23 18:56  /  2304 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田建 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
StringBuffer内部是通过创建字符数组保存数据的,假如当前的容量小于实际存储的容量,它会以2倍容量的大小,重新构造新的字符数组,然后将以前的内容拷贝到新的字符数组中。
假如我们知道了需要存储数据的大小,直接指定开辟的空间,那样可以减少内部数组创建的次数。
回复 使用道具 举报
capacity即容量是这个对象本身能够容纳的字符数量,而StringBuffer中的length属性是指,实际存入的字符的数量。容量一旦设立就是固定的,不会随着你实际放入的数量而改变。举个例子来说:
比如说一个水桶,他的容量是3L,然而你实际上加了1L的水,现在你要从中倒掉0.5L水,实际装的水减少了,但是它的容量是不变的依然是3L。希望能帮到你理解
回复 使用道具 举报
解释:
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倍了..

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上哥们分析的很是透彻,赞一个
回复 使用道具 举报
常佳杰 发表于 2012-6-23 20:28
解释:
StringBuffer( String s ); //除了按照s的大小分配空间外,再分配16个字符的缓冲区
你的StringBuffer ...

我的意思是既然它的capacity是55,为什么会容不下39的长度呢?
回复 使用道具 举报
怎么会容不下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:35
8#
常佳杰 发表于 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了,这是?!
回复 使用道具 举报
后边你改的是它的长度,改不了容量的(除非你的字符串长度超过55....)所以输出的容量仍然是55.

上边说过的问题,希望好好看...
回复 使用道具 举报
setLength() 方法是设置字符序列的长度,操作对象是字符串
sb.setLength(30);该序列将被更改为一个的字符序列,新序列的长度是30,
结果:sb=it is a far,far better thing t 长度就是30
---------------------------------------------------
而sb.capacity()是返回缓冲区的容量
回复 使用道具 举报
多谢各位的耐心解答!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马