您的位置:首页 > 编程语言 > Java开发

Java字符串各种连接方式性能比较

2013-05-31 14:03 429 查看
最近项目中经常用到字符串连接。

究竟哪种写法最简捷,哪种最高效呢。

    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 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. 性能优化是万恶之源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息