论坛首页 入门技术论坛

这个循环太让人郁闷了

浏览 12367 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-04-08  
呵呵。碰到大数据,才发现。String和StringBuffer有如此大的性能差距。。
0 请登录后投票
   发表时间:2009-04-08  
晕。
貌似以前做过测试,看了字节码,发现java会自动将string+string优化成stringbuilder的append。
0 请登录后投票
   发表时间:2009-04-25  
sunnycare 写道
晕。
貌似以前做过测试,看了字节码,发现java会自动将string+string优化成stringbuilder的append。

说实话,我也是受这种教育的。
不过经过测试确实如楼主说所,存在巨大差距。我直接将那个倒霉的string+string给当了。
我在编译时没有加参数。
很多人说 写道

Java的编译器在遇到比较长的字符串+操作,内部会自动变成StringBuilder的append操作
0 请登录后投票
   发表时间:2009-04-25  
qianjigui 写道
sunnycare 写道
晕。
貌似以前做过测试,看了字节码,发现java会自动将string+string优化成stringbuilder的append。

说实话,我也是受这种教育的。
不过经过测试确实如楼主说所,存在巨大差距。我直接将那个倒霉的string+string给当了。
我在编译时没有加参数。
很多人说 写道

Java的编译器在遇到比较长的字符串+操作,内部会自动变成StringBuilder的append操作

那是在jvm可感知的范围内.....

jvm又不是先知....知道你隔80行后还要去加个字符串
0 请登录后投票
   发表时间:2009-04-25  
抛出异常的爱 写道
那是在jvm可感知的范围内.....

jvm又不是先知....知道你隔80行后还要去加个字符串

JVM确实是不知道。把+换成StringBuilder.append是编译器做的而不是JVM做的。像这个:
public class Foo {
    public static void main(String[] args) {
        String a = "";
        String b = "";
        String c = "";
        String d = "";
        String e = a + b + c;
        e = e + d;
    }
}

编译出来的.class文件就跟这个基本等价:
public class Foo {
    public static void main(String[] args) {
        String a = "";
        String b = "";
        String c = "";
        String d = "";
        String e = new StringBuilder()
                   .append(a)
                   .append(b)
                   .append(c)
                   .append(d)
                   .toString();
    }
}

唯一不等价的地方就是.class文件里main方法的LineNumberTable的数据不一样了。
0 请登录后投票
   发表时间:2009-06-25  

  当然StringBuffer或StringBuilder是首选哦。

  LZ貌似还是初学......
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics