简单分析Java字符串的拼接

在项目开发过程中,字符串拼接的出现十分频繁,Java提供了多种手段来进行字符串拼接,下面简单一一介绍。

使用+号进行拼接

+号拼接是十分常见的拼接方式,最易于理解,但是它的效率如何呢,下面通过代码进行分析。

public class Test{
    public static void main(String[] args){
        String s = "hello";
        s += "world";
        System.out.println(s);
    }
}

通过以下命令可以编译java文件并查看字节码文件

java c Test.java
javap -c Test

结果如下


简单分析Java字符串的拼接_第1张图片

通过结果可以发现,s+= "world"的底层实现其实是首先生成一个StringBuilder对象实例,然后通过append方法将所+的字符串拼接,然后使用toString转为字符串。
当需要循环拼接大量的字符串时,如果使用+号,将会产生大量的StringBuilder对象并且多次调用toString方法,空间时间上都消耗很大。

使用concat拼接

之前写过的一篇文章中已经分析过concat的内部原理
https://www.jianshu.com/p/c810a68462e7
concat最后返回了一个新的String对象,如果置于循环内,同样会产生大量的String对象。

使用StringBuilder与StringBuffer

这两种方法通过append方法进行拼接,不同之处是StringBuffer的方法有synchronized关键字加持,线程安全,但同时牺牲了一定的效率。
append内部原理和concat有类似的地方,但是通过append方法进行拼接时,不会向之前的拼接方法一样重复产生多个新的对象。
在循环拼接大量字符串时,只需要在循环体前创建一次StringBuilder或StringBuffer对象,循环结束后执行一次toString即可。

public static void main(String[] args){
    StringBuilder sb = new StringBuilder();
    for(...){
        sb.append(...);
    }
    String result = sb.toString();
}

总结

在进行大数据量字符串拼接时,千万不要使用+或者concat,虽然+号易于理解,但是这会极大的消耗时间和空间。

附一张网上的图供参考
简单分析Java字符串的拼接_第2张图片
字符串拼接开销

你可能感兴趣的:(简单分析Java字符串的拼接)