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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张权 中级黑马   /  2012-12-31 20:55  /  2103 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张权 于 2013-1-1 00:01 编辑

  StringBuffer s = new StringBuffer();//构造一个缓冲区,默认16个字符的容量.
s.append("hahahahahahaahahahahahahahahahaaha");//调用append方法追加字符串到缓冲区
问题:默认的不是只有16个字符的容量么?这个可以理解为StringBuffer的容量是可变的吗?
如果是这样,那么  StringBuffer (int capacity)这个方法岂不是显得没用了吗?因为这个方法就是构造一个不带字符,但具有指定初始容量的字符串去啊?  我不指定初始容量它自己也可以根据我追加的字符串而改变容量,要这个方法还有什么用呢

评分

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

查看全部评分

7 个回复

倒序浏览
本帖最后由 马志军 于 2012-12-31 21:08 编辑

是可变的,StringBuffer (int capacity)只是刚开始指定一个初始大小的,如果你添加的没超过容量,定义小点不省空间嘛。
如果超出了,那就自动增加容量
API里原话:每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

评分

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

查看全部评分

回复 使用道具 举报
你看Api怎么就看一部分呢?StringBuffer默认的的是16个字符没错,但是有几句话你的记住,它是可变序列的
其实就是相当于一个容器。
回复 使用道具 举报
这相当于一种缓冲机制,用来节约内存空间的嘛。

当我们添加的内容不超过初始定义大小时,就不用
自动增加容量了,反之就自动增加。
回复 使用道具 举报
StringBuffer的capacity可以改变,
StringBuffer (int capacity)只是个初始大小的,如果你新插入字符串超过这个空间,更大的空间将会重新分配给它。

回复 使用道具 举报
本帖最后由 王玮 于 2012-12-31 23:32 编辑

  1.   public synchronized StringBuffer append(int i) {
  2.         super.append(i);
  3.       return this;
  4.     }
  5. ===================================
  6. public AbstractStringBuilder append(char c) {
  7.         int newCount = count + 1;
  8.         if (newCount > value.length)
  9.             expandCapacity(newCount);
  10.        value[count++] = c;
  11.         return this;
  12.     }
  13. /**
  14.      * This implements the expansion semantics of ensureCapacity with no
  15.      * size check or synchronization.
  16.      */
  17.     void expandCapacity(int minimumCapacity) {
  18. int newCapacity = (value.length + 1) * 2;
  19.         if (newCapacity < 0) {
  20.             newCapacity = Integer.MAX_VALUE;
  21.         } else if (minimumCapacity > newCapacity) {
  22.      newCapacity = minimumCapacity;
  23. }
  24.         value = Arrays.copyOf(value, newCapacity);
  25.     }
复制代码
有初始容量 (int capacity) ,先分配你初始的 ,你不分配就自己默认分配,当不够的时候 再在自动的分,此举节约内存呗
~
回复 使用道具 举报
张权 中级黑马 2012-12-31 23:57:32
7#
马志军 发表于 2012-12-31 21:05
是可变的,StringBuffer (int capacity)只是刚开始指定一个初始大小的,如果你添加的没超过容量,定义小点 ...

  哦,知道了!!!
回复 使用道具 举报
StringBuffer(int capacity)这是个构造方法
用来创建缓冲区,容量为capacity。
使用这个构造器,可以自己指定容量!
扩充容量会影响效率!
浪费容量就是影响内存。
以时间换空间。
以空间换时间。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马