Java字符串连接性能
来源:互联网 发布:亲知闻知说知什么意思 编辑:程序博客网 时间:2024/06/11 17:03
剑字有19种写法,Java中字符串连接也有好多种写法,比如要连接6个字符串,以下5种写法都是可以的,究竟哪种写法最简捷,哪种最高效呢。
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. 性能优化是万恶之源
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字符串各种连接方式性能比较
- 字符串连接的性能(Effective java)- -
- Java字符串各种连接方式性能比较
- Java各种字符串连接方法性能比较
- Java字符串连接的性能问题
- javascript 字符串连接性能
- 字符串连接性能(转载)
- 连接字符串连接的性能
- java 代码细节(当心字符串连接的性能)
- Java五种字符串连接的性能比较
- 【Java性能】你需要知道的:Java字符串连接使用"+"和StringBuilder性能比较
- ECMAScript字符串连接性能问题
- 重谈字符串连接性能
- c#字符串连接性能测试
- javascript字符串连接的性能
- 大连确定信息化推广应用重点
- 金蝶宣布未来三年战略 向服务型公司转型
- 生成/读取(反向更新数据库) Excel文件(示例代码下载)
- 金旭亮著作斟误表及未来写作计划
- 联想称有能力进行大型收购 酝酿向中东扩张
- Java字符串连接性能
- 薪资报价(Confidential)
- 文本挖掘技术在CIC的应用
- oracle 字符串函数-删除指定匹配字符内字符
- TinyOS、NesC程序开发经验谈
- 我奋斗了18年才和你坐在一起喝咖啡
- EJB 学习笔记之 -会话Bean
- Cool Stuff with Delphi #16 -- Arcane Fractals
- 如何防止拖动窗体大小时控件闪烁的问题