黑马程序员技术交流社区

标题: 关于StringBuffer的容量问题? [打印本页]

作者: 刘辉    时间: 2013-3-15 21:25
标题: 关于StringBuffer的容量问题?
本帖最后由 黄玉昆 于 2013-3-16 13:55 编辑

2. public class StringBufferDemo {
        public static void main(String[] args) {
        
                StringBuffer sb = new StringBuffer();
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());

        
                StringBuffer sb2 = new StringBuffer("hello");
                System.out.println("sb2:" + sb2);
                System.out.println("sb2:"+sb2.length());
                System.out.println("sb2:"+sb2.capacity());

                System.out.println("******************************");
               
                sb.append("helloworld");
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());
                System.out.println("******************************");
               
                sb.append("helloworld");
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());
               
                sb.append("helloworld");
                sb.append("helloworld");
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());

        }
}
打印的结果是:  sb:
sb:0
sb:16
sb2:hello
sb2:5
sb2:21
******************************
sb:helloworld
sb:10
sb:16
******************************
sb:helloworldhelloworld
sb:20
sb:34
sb:helloworldhelloworldhelloworldhelloworld
sb:40
sb:70
疑问:sb:34那里本来应该得到的结果不应该是默认容量加上字符串的长度16+10+10=36么?怎么变成34了?最后的70也是,为什么?

作者: 沈子豪    时间: 2013-3-15 21:33
public class StringBufferDemo {
        public static void main(String[] args) {
               
                StringBuffer sb = new StringBuffer();
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());

               
                 StringBuffer sb2 = new StringBuffer("hello");
                 System.out.println("sb2:" + sb2);
                 System.out.println("sb2:"+sb2.length());
                 System.out.println("sb2:"+sb2.capacity());

                System.out.println("******************************");
                sb.append("helloworld");
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());
                System.out.println("******************************");
               
                sb.append("helloworld");
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());
       
                sb.append("hello");/
                sb.append("helloworld");
                System.out.println("sb:" + sb);
                System.out.println("sb:" + sb.length());
                System.out.println("sb:" + sb.capacity());

        }
}
这里面是固定的只要添加,如果字符串长度超过容量,则添加后的字符串的容量都会变成2(以前容量+1),以保证容量是始终增加的.34=2*(16+1),70=2*(34+2).

作者: 黑马李超    时间: 2013-3-15 21:37
可以查看下API中 StringBuffer的ensureCapacity方法
如果当前容量小于 minimumCapacity 参数,则可分配一个具有更大容量的新的内部数组。新容量的大小应大于:
minimumCapacity 参数。
旧容量的两倍加 2。

作者: 朱盛文    时间: 2013-3-15 22:02
本帖最后由 朱盛文 于 2013-3-15 23:56 编辑

[code]public class StringBufferDemo {
        public static void main(String[] args) {
        
                StringBuffer sb = new StringBuffer();
                System.out.println
作者: 黄玉昆    时间: 2013-3-15 22:21
楼主,你写这么多的打印语句,不累吗?




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