Java字符串各种连接方式性能比较
来源:互联网 发布:中国招标软件 编辑:程序博客网 时间:2024/05/22 17:36
最近项目中经常用到字符串连接。
究竟哪种写法最简捷,哪种最高效呢。
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. 性能优化是万恶之源
- Java字符串各种连接方式性能比较
- Java字符串各种连接方式性能比较
- Java各种字符串连接方法性能比较
- 字符串连接方式性能比较
- Java字符串拼接方式性能比较
- Java 字符串拼接方式性能比较
- JS中三种字符串连接方式及其性能比较
- JS中三种字符串连接方式及其性能比较
- JS中三种字符串连接方式及其性能比较
- 字符串拼接方式性能比较
- Java五种字符串连接的性能比较
- Java 5种字符串拼接方式性能比较。
- Java 5种字符串拼接方式性能比较
- Java 5种字符串拼接方式性能比较
- Java 5种字符串拼接方式性能比较。 .
- Java 5种字符串拼接方式性能比较。
- Java 5种字符串拼接方式性能比较。
- Java 5种字符串拼接方式性能比较
- adb server is out of date. killing问题
- OpenCV中一个连通域处理函数
- PB运行库(PB6.5,PB7,PB8,PB9)
- short cut使用动态图片
- 关于Android的字体
- Java字符串各种连接方式性能比较
- mysql 出现 Cannot proceed because system tables used by Event Scheduler were found damaged at server
- MyReport报表引擎2.7.4.0新功能
- mysql 存储过程-动态表名
- .NET强签名及混淆解决方案
- WinCE如何使用PictureBox的Image属性通过图片路径显示图片
- LFS<0531-1>
- Ubuntu下为Firefox安装Adobe Flash Player
- 【2013】实习收获2:python的网络编程--client端与server端入门(client端)