Java的字符串拼接与性能

夜影 2011-04-18 10:18:30
[导读]在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了。 假如你用”+”来连接固定长度的字符串, 能够性能上会稍受影响, 但是假如你是在循环中来”+”多个串的话, 性能将指数倍的下降。   在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了。 假如你用”+”来连接固定长度的字符串, 能够性能上会稍受影响, 但是假如你是在循环中来”+”多个串的话, 性能将指数倍的下降。 假定有一个字符串, 我们将对这个字符串做大量循环拼接操作, 使用”+”的话将失掉最低的性能。 但是终究这个性能有多差?假如我们同时也把StringBuffer, StringBuilder或String. concat()放入性能测试中, 结果又会如何呢?本文将会就这些问题给出一个答案!   我们将使用Per4j来计算性能, 由于这个工具可以给我们一个完好的性能目标集合, 比如最小?畲蠛氖保?统计工夫段的规范偏向等。 在测试代码中, 为了失掉一个准确的规范偏向值, 我们将执行20个拼接”*”50, 000次的测试。 上面是我们将使用到的拼接字符串的办法:  Concatenation Operator (+)   String concat method – concat(String str)   StringBuffer append method – append(String str)   StringBuilder append method – append(String str)   最后, 我们将看看字节码, 来研讨这些办法到底是如何执行的。 现在, 让我们先末尾来创建我扪的类。 留意为了计算每个循环的性能, 代码中的每段测试代码都需求用Per4J库进行封装。 首先我们先定义迭代次数  1 private static final int OUTER_ITERATION=20;   2 private static final int INNER_ITERATION=50000;   接下来, 我们将使用上述4个办法来完成我们的测试代码。   结果十分完美如我们想象的那样。 独一比较有趣的事情是为什么String. concat也很不错, 我们都知道, String是一个常类(初始化后就不会改动的类), 那么为什么concat的性能会更好一些呢。 (译者注:其实原文作者的测试代码有问题, 关于concat()办法的测试代码应该写成concatTestStr=concatTestStr. concat(“*”)才对。 )为了回答这个问题, 我们应该看看concat反编译出来的字节码。 在本文的下载包外面包括了一切的字节码, 但是现在我们先看一下concat的这个代码片段:  01 46: new #6; //class java/lang/StringBuilder   02 49: dup   03 50: invokespecial #7; //Method java/lang/StringBuilder. "":()V   04 53: aload_1   05 54: invokevirtual #8; //Method java/lang/StringBuilder. append:   06 (Ljava/lang/String;)Ljava/lang/StringBuilder;   07 57: ldc #9; //String *   08 59: invokevirtual #8; //Method java/lang/StringBuilder. append:   09 (Ljava/lang/String;)Ljava/lang/StringBuilder;   10 62: invokevirtual #10; //Method java/lang/StringBuilder. toString:()   11 Ljava/lang/String;   12 65: astore_1   13 66: iinc 7, 1   14 69: goto 38   这段代码是String. concat()的字节码, 从这段代码中, 我们可以清楚的看到, concat()办法使用了StringBuilder, concat()的性能应该和StringBuilder的一样好, 但是由于额外的创建StringBuilder和做. append(str). append(str). toString()的操作, 使得concate的性能会遭到一些影响, 所以StringBuilder和String Cancate的工夫是1. 8和3. 3。   因此, 即时在做最简单的拼接时, 假如我们不想创建StringBuffer或StringBuilder实例使, 我们也因该使用concat。 deeremarchi.dota8.cn 迪尔马奇 但是关于大量的字符串拼接操作, 我们就不应该使用concat(译者注:由于测试代码功用上并不完全等价, 更换后的测试代码concat的均匀处理工夫是1650. 9毫秒。 这个结果在原文的评论外面。 ), 由于concat会降低你顺序的性能, 耗费你的cpu。 因此, 在不思索线程安全和同步的状况下, 为了取得最高的性能, 我们应尽量使用StringBuilder

本文摘自: 编程十万个为什么(http://www.bcwhy.com) 详细出处请参考:http://www.bcwhy.com/thread-1820-1-1.html
...全文
216 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2011-04-18
  • 打赏
  • 举报
回复
ad 无处不在

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧