阿里巴巴Java开发手册:for循环里拼接字符串为什么最好用StringBuilder?

460 阅读1分钟

前言

之前在看到一篇文章,说到for循环里拼接字符串最好用StringBuilder,而不是String+=“”,联想到读过的《阿里巴巴Java开发手册》也有类似的说辞。但那是看了之后没再深究,所以借这篇文章深入分析一下为什么for循环里拼接字符串为什么最好用StringBuilder?

举例

平时写代码的时候,我们经常会遇到在一个循环里去拼接字符串,为了追求效率,很多人会直接写上如下的代码:

    public static void main(String[] args) {
        String s= "" ;
        for(int i=1;i<10;i++){
            s+=i;
        }
        System.out.println(s);
    }

分析

根据《阿里巴巴开发手册》里的说法,这种写法一般会引起空间浪费问题。下面仔细说下为什么会引起这类问题。

  • 使用字节码工具在cmd里执行
    javac Test.java
    javap -c Test.class

可以大概看出在11行的时候new了一个java.lang.StringBuilder的对象,其他就是一些操作数栈到变量,变量到操作数栈的赋值过程。想要看懂相应字节码代表的意思,可以参考文章: Java生成字节码的意思
如果还不够直观,可以看下面的方式。

  • 使用jad工具反编译代码

这里就可以更明显地看出其实每次循环的时候都会去new一个StringBuilder对象,然后再toString,最后赋值给s

总结

  1. 在单线程少并发的情况下,尽量用StringBuilder代替简单粗暴的+=,减少新生成对象的空间浪费。
  2. +=实际上是java语言提供给String类型的语法糖,其实现原理是使用StringBuilder.append。