java 字符串连接
2016-02-01 00:00
399 查看
Java中字符串连接也有好多种写法,比如要连接6个字符串,以下5种写法都是可以的,究竟哪种写法最简捷,哪种最高效呢。
第一种写法是最土的写法,也最累赘,事实上看到这样的代码我都会有点头疼。看过《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. 性能优化是万恶之源
public static String concat1(String s1, String s2, String s3, String s4, String s5, Strings6) { 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, Strings6) { 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, Strings6) { 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, Strings6) { return s1 + s2 + s3 + s4 + s5 + s6; }
public static String concat5(String s1, String s2, String s3, String s4, String s5, Strings6) { 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. 性能优化是万恶之源
相关文章推荐
- java 获取数组长度
- java 双引号包含双引号
- 转 springMVC+mybatis+ehcache详细配置
- 为什么我安装不了java语言这个软件“java_ee_sdk-7-jdk7-windows-x64-ml.exe”
- JSP技术已死 ? (Java Server Page technology will die) ?
- eclipse导入mysql jdbc驱动包的具体步骤及注意事项
- Spring知识点总结大全
- eclipse中git分支创建与合并(-)
- elasticsearch JAVA客户端操作---索引的CURD
- Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
- 通过Java Api与HBase交互(转)
- Spring mvc进行Excel导出
- 关于Java集合总结
- 解析java中volatile关键字
- java中的 FileWriter类 和 FileReader类的一些基本用法
- Spring注解@Component、@Repository、@Service、@Controller区别
- java线程安全问题之静态变量、实例变量、局部变量
- 关于JAVA的路径
- java学习的三十个目标
- Struts 2学习笔记