new StringBuffer("a"+"b"+"c"+"e"+"f"+"g").append("hijklmn")
上面的代码我都有点迷惑,不知道作者怎么想的,应该说他也听说过StringBuffer的好处的我们项目中就有人这么写的,我测过
    public static void main(String args[]) throws Exception {
        String s="abcdefghijklmnopqrstuvwxyz";
        String b=s;
        
        
        long start = System.currentTimeMillis();
        for(int i=0;i<1000;i++) {
            b+=s;
        }
        System.out.println("用 String 耗时:"+(System.currentTimeMillis()-start));
        
        s="abcdefghijklmnopqrstuvwxyz";
        StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
        start = System.currentTimeMillis();
        for(int i=0;i<1000;i++) {
            sb.append(s);
            sb.toString();
        }
        System.out.println("用 StringBuffer 耗时:"+(System.currentTimeMillis()-start));
    }下面是几组执行结果:
1。
用 String 耗时:19124
用 StringBuffer 耗时:37192。
用 String 耗时:20109
用 StringBuffer 耗时:49213。
用 String 耗时:15562
用 StringBuffer 耗时:33444。
用 String 耗时:19109
用 StringBuffer 耗时:58435。
用 String 耗时:18453
用 StringBuffer 耗时:5016如果先测试StringBuffer,代码如下
    public static void main(String args[]) throws Exception {
        String s="abcdefghijklmnopqrstuvwxyz";
        String b=s;
        
        StringBuffer sb = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
        
        long start = System.currentTimeMillis();
        for(int i=0;i<1000;i++) {
            sb.append(s);
            sb.toString();
        }
        System.out.println("用 StringBuffer 耗时:"+(System.currentTimeMillis()-start));
        
        s="abcdefghijklmnopqrstuvwxyz";
        start = System.currentTimeMillis();
        for(int i=0;i<1000;i++) {
            b+=s;
        }
        System.out.println("用 String 耗时:"+(System.currentTimeMillis()-start));
    }那么测试出来的几组结果为:1。
用 StringBuffer 耗时:5203
用 String 耗时:179372。
用 StringBuffer 耗时:4515
用 String 耗时:174533。
用 StringBuffer 耗时:3984
用 String 耗时:148754。
用 StringBuffer 耗时:4609
用 String 耗时:184225。
用 StringBuffer 耗时:4235
用 String 耗时:17109上面的数据是在我的机器系统资源十分紧缺的情况下测出来的,所以数字都比较的大
但怎么都不会影响数据的比较,及说明问题
它们最终都是生成一样的字符串
特别是有些人在处理复杂SQL语句的时候经常有字符串的连接
用StringBuffer比String++快多了

解决方案 »

  1.   

    new StringBuffer("a"+"b"+"c"+"e"+"f"+"g").append("hijklmn")
    写这代码的的人对StringBuffer的发明者是一种侮辱!
      

  2.   

    "a"+"b"+"c"+"e"+"f"+"g"是不是代码写的长多发钱啊,呵呵
      

  3.   

    表达形式而已,其实我上面的示例代码写错了
    new StringBuffer("a"+"b"+"c"+"e"+"f"+"g").append("hijklmn");
    其生成的字节码与
    new StringBuffer("abcdefg").append("hijklmn");
    是一样的StringBuffer中参数如果是全常量字符串相加会在java编译器编译时会优化成一个字符串我想要说明的是,有人在代码中写成了下面的样子
    new StringBuffer("a"+this.sql+"b"+"c"+"e"+"f"+"g").append("hijklmn");
    中间加了一个变量就大了一样了
      

  4.   

    总结一下,要说呢,代码写成了
    new StringBuffer("a"+this.sql+"b"+"c"+"e"+"f"+"g").append("hijklmn");
    其执行效果与下是一样的
    new StringBuffer("a").append("b")..append(this.sql)..append("c")..append("d").append("e").append("f").append("g").append("hijklmn")矫正一下,从代码执行上来说是不会有问题的java最怕的是在外面的字符串加字符串
      

  5.   

    对于可控长度或者已知长度有限的字符串相加完全可以用 String +的方式,
    而对于长度一直递增的或者是迭加次数比较多的时候就要用StringBuffer了
      

  6.   

    回复人: funcreal(为中华之崛起而编程) ( ) 信誉:100  2005-12-13 17:42:00  得分: 0  
     
     
       有时候你乍一看不一定知道别人为什么这样做,我劝搂主不要早下定论。
      
     
    这个似乎不牵扯到什么定论不定论,这样写出的代码,我都当它是laji
      

  7.   

    StringBuffer中参数如果是全常量字符串相加会在java编译器编译时会优化成一个字符串应该是的,不过如果是比较长的串,我一般还是用StringBuffer或才StringBuilder,还是不要让jdk编译时处理的好发现StringBuilder其实也不错,(.net下就有StringBuiler,不是除了同步的效率外,jdk是否为了考虑从.net下移植代码加了StringBuilder)
      

  8.   

    从jdk1.5开始,已经有了StringBuilder,如
    java.lang 
    Class StringBuilder
    java.lang.Object
      java.lang.StringBuilderAll Implemented Interfaces: 
    Serializable, Appendable, CharSequence 而且用jdk1.5编译器来编译如下代码
     String a="a";
            a+=a;
    就会借助于StringBuilder来处理 0:   ldc     #17; //String a
     2:   astore_1
     3:   new     #19; //class StringBuilder
     6:   dup
     7:   aload_1
     8:   invokestatic    #25; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
     11:  invokespecial   #28; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
     14:  aload_1
     15:  invokevirtual   #32; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     18:  invokevirtual   #36; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     21:  astore_1楼上的,能不能帮忙解释一下,StringBuilder与StringBuffer比有什么好处当初我也是查看用jdk1.5编译器编译出来的class才发现jdk1.5下多出了一个StringBuilder
    但到现在还不是很明白它的优越性,一直也没有细究下去