通用程序设计——当心字符串连接的性能

文章讨论了在Java中使用+运算符进行字符串连接的效率问题,特别是在大规模场景下,由于字符串的不可变性,会导致性能下降。虽然JDK会自动优化一些简单情况,但复杂场景如循环中的连接仍需手动优化,推荐使用StringBuilder以提高性能。文章强调了编写高效代码的重要性,因为JDK的优化并非总是适用且一致。
摘要由CSDN通过智能技术生成

+ 除了表示基本数据的加法计算之外,也可用作字符串连接操作符,任何类型都可以和字符串使用+来合并为一个新的字符串。

这种连接方式比较简单,对于较小的对象比较合适。但在大规模场景中,这样的做法并不合适。

为连接 n 个字符串而重复使用+操作符,需要n的平方级的时间。这是由于字符串是不可变的,每次操作都是拷贝他们的内容,合并到一个新的 String 实例中。


虽然较新的 jdk 可以自动优化部分场景,但只局限在能够推断和优化的场景下。

比如

String aa = "gu"+"vvu";
此代码因为是编译时就可以确认最终内容,所以会被优化为 String aa = "guvvu"; 

同时,在无法直接获得最终内容时,+ 操作会被优化为StringBuilder

比如

String ss = s1 + s2+s3;
会被优化为
String ss = new StringBuilder().append(s1).append(s2).append(s3).toString();

但自动优化能做的毕竟是有限的,有些场景是无法被自动优化的,这时候需要手动来处理,避免频繁使用+操作。比如循环中

String ss = "";
if(!strs.isEmpty){
    for(String s: strs){
        if(ss.isEmpty()){
            ss = s;
        }else{
             ss = ss +","+s;
        }
    }
}
此代码无法被完美优化,只能被优化为
String ss = "";
if(!strs.isEmpty){
    for(String s: strs){
        if(ss.isEmpty()){
            ss = s;
        }else{
             ss = new StringBuilder().append(ss).append(",").append(s).toString();
        }
    }
}

其实这里,我们可以手动优化到更好,这种做法的性能在循环次数越多时,比上面的办法性能优势越大。
 StringBuilder sb = new StringBuilder();
 if(!strs.isEmpty()){
    for(String s: strs){
       if(sb.length()==0){
            sb.append(s);
       }else{
             sb.append(",").append(s);
        }
     }
 } 

最后,+自动优化是jdk 提供优化的,但并不是标准,所以不存在一定会优化,也不一定会优化到什么程度,所以,把自己代·码写好才是最根本的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值