文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>java中字符串链接性能比较...

java中字符串链接性能比较...

时间:2010-08-13  来源:Ghost_T

原帖地址:http://blog.csdn.net/bestseal/archive/2008/04/16/2296283.aspx

public static String concat1(String s1, String s2, String s3, String s4, String s5, String s6) {
        String result = "";
        result += s1;
        result += s2;
        result += s3;
        result += s4;
        result += s5;
        result += s6;
        return result;
    }

    public static String concat2(String s1, String s2, String s3, String s4, String s5, String s6) {
        StringBuffer result = new StringBuffer();
        result.append(s1);
        result.append(s2);
        result.append(s3);
        result.append(s4);
        result.append(s5);
        result.append(s6);
        return result.toString();
    }

    public static String concat3(String s1, String s2, String s3, String s4, String s5, String s6) {
        return new StringBuffer(s1.length() + s2.length() + s3.length() + s4.length() + s5.length() + s6.length())
                .append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString();
    }

    public static String concat4(String s1, String s2, String s3, String s4, String s5, String s6) {
        return s1 + s2 + s3 + s4 + s5 + s6;
    }

    public static String concat5(String s1, String s2, String s3, String s4, String s5, String s6) {
        return new StringBuilder(s1.length() + s2.length() + s3.length() + s4.length() + s5.length() + s6.length())
                .append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString();
    }

第一种写法是最土的写法,也最累赘,事实上看到这样的代码我都会有点头疼。看过《Effective Java》的朋友都知道用StringBuffer吧,用第二种写法的人应该也不少。第4种写法当然最简捷,最优美的了,就是不知道性能怎么样。Java 5里加了个StringBuilder类,与StringBuffer功能一样,就是没有同步,所有用StringBuilder代替 StringBuffer肯定对性能有好处,这样就产生的第5种写法。

还是做个测试有说服力。我的机器上同时装了JDK 5和JDK 6,两个都测了一下。执行每个函数10000000次(输入的每个参数都是"a"),各种写法用时如下,单位毫秒:

----------------------------------
我补充JDK 3:
[concat1] Time: <19656>
[concat2] Time: <4032>
[concat3] Time: <5671>
[concat4] Time: <4469>

我补充JDK 4:
[concat1] Time: <36265>
[concat2] Time: <12156>
[concat3] Time: <13860>
[concat4] Time: <12859>
-----------------------------------

JDK 5:
concat1: 13776
concat2: 5081
concat3: 4944
concat4: 4202
concat5: 4047

JDK 6:
concat1: 11801
concat2: 3930
concat3: 3976
concat4: 3353
concat5: 3440

可以看出第1种写法果然最慢,第二种写法由于用了StringBuffer,快了很多。奇怪的是第4种写法竟然也很快,比用 StringBuffer还快,怎么回事?其实如果你调试过字符串连接的执行过程就会知道当用第4种写法时Java会自动使用 StringBuilder.append()函数来进行连接。所以最简捷的第4种写法已经够快了。在JDK 5里,第5种写法最快,因为在创建StringBuilder的时候预先计算了总长度,消除了内存重分配。不过没有必要这么写,JDK 6里已经为第4种写法做了更好的优化,第5种写法反而慢了。

由此可见,采用最简单的第4种写法对于Java的实现来说优化的可能性越大。就像SQL一样,由于采用了陈述式的写法,优化器才有了优化的余地。想起了两句话:
1. 简单即美,谁都希望看到简洁明快的代码,不希望看到冗长乏味的代码
2. 性能优化是万恶之源

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载