System.out.println(System.getProperty("java.version"));
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
for(int i=0;i<1000000000;i++){
String str = new String("");
}
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
System.out.println("----------------------");
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
for(int i=0; i<1000000000;i++){
StringBuffer str = new StringBuffer("");
}
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());

System.out.println("----------------------");
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
for(int i=0; i<1000000000;i++){
test1 t = new test1();
}
System.out.println(System.currentTimeMillis());
System.out.println(new java.util.Date());
我分别new 1亿个 String StringBuffer 和 test1 对象,结果如下:
(String)
1.5.0_11
1238639830062
Thu Apr 02 10:37:10 CST 2009
1238639834437
Thu Apr 02 10:37:14 CST 2009
----------------------
(StringBuffer)
1238639834437
Thu Apr 02 10:37:14 CST 2009
1238639874375
Thu Apr 02 10:37:54 CST 2009
----------------------
(test1)
1238639874375
Thu Apr 02 10:37:54 CST 2009
1238639875187
Thu Apr 02 10:37:55 CST 2009我加到了10亿个,这个我是分开单个测试的,发现new StringBuffer 的耗时就远远大于其他那两个了,
new 10亿个的结果分别如下:1.5.0_11
1238639226906
Thu Apr 02 10:27:06 CST 2009
1238639258796
Thu Apr 02 10:27:38 CST 2009
String 花了 差不多32秒
-------------------------1.5.0_11
1238639380140
Thu Apr 02 10:29:40 CST 2009
1238639511687
Thu Apr 02 10:31:51 CST 2009
StringBuffer 花了 差不多2分钟19秒
----------------------1.5.0_11
----------------------
1238639579843
Thu Apr 02 10:32:59 CST 2009
1238639588406
Thu Apr 02 10:33:08 CST 2009
test1对象花了 9秒这是为什么呀,为什么StringBuffer比其他两个要多花那么多时间?
他在虚拟机中创建对象的时候和其他两个有什么区别吗 ?

解决方案 »

  1.   

    我只知道StringBuffer的开销很大,因为它相当于一个动态字符串,原理不是太明白。
    它是线程安全的,StringBuilder比他快,功能差不多,但是不是线程安全的。
    期待高手的回答!
      

  2.   

        StringBuffer b = new StringBuffer(); // value = new char[capacity];
        String s = new String(); // this.value = new char[0];StringBuffer需要一个长度为16的字符数组,String则是长度为0的。这个只是很基本的不同,当然String会快了。
      

  3.   

    有区别
    String的构造方法一般复杂
    StringBuffer的构造方法最变态,有一个超类需要先构造,而且带String参数的构造方法还调用到了带锁的方法
    test1类的时间和你自己写的构造方法复杂程度有关( ̄(工) ̄)
      

  4.   

    StringBuffer.java
        public StringBuffer() {
    super(16);
        }
        AbstractStringBuilder(int capacity) {
            value = new char[capacity];
        }String.java
        public String() {
    this.offset = 0;
    this.count = 0;
    this.value = new char[0];
        }
      

  5.   

    StringBuffer 因为是可变的字符串 它在做连接操作的时候 不要在开销空间了 当然在创建的时候要有一定的策略了,StringBuffer的存储原理是什么样子的呢 应该预留一点空间,或者有什么存储的策略吧顶 期待高手