String拼接优化

String字符串拼接优化

在之前的笔记String、StringBuffer、StringBuilder三兄弟中,提到

String被声明为final class,即String类型不可变,正因为他的不可变性,当我们拼接字符串时会产生很多无效的中间对象,频繁的使用String字符串做拼接,会产生大量的垃圾对象,影响系统的性能。

我们知道可以用StringBuilder、StringBuffer的append方法来代替普通的"+"方式,但如果代码直接使用的"+",那Java编译器真的会傻傻的采用"+"方式么?写个Demo,看看编译器有没有什么"小动作":

public class TestString {
    public static void main(String[] args) throws Exception {
        String str1 = "abc";
        String str2 = "d";
        String str3 = "e";
        String str4 = "f";
        System.out.println(str1 + str2 + str3 + str4);
    }
}

通过javap -c TestString.class命令进行反编译(忽略我这不知道咋地就过期的windows...)(注:jdk1.5以前,应该是通过StringBuffer进行优化的,因为那时候StringBuilder还没出生...没有找到老版本jdk所以没有进行测试,有环境的兄嘚可以试一下):

String拼接反编译class文件

通过反编译的内容,我们看到编译器创建了StringBuilder对象,通过append方式代替了“+”的方式,说明编译器在编译过程中“偷偷”对代码进行了优化。

循环拼接下的优化

public class TestString {
    public static void main(String[] args) throws Exception {
        String str1 = "abc";
        for (int i = 0; i < 4; i++) {
            str1 += i;
        }
        System.out.println(str1);
    }
}

通过查看反编译的class文件,编译器在for循环内部每次都新创建了StringBuilder,然后再去append拼接,这本身就是浪费资源了,所以不能够太依赖编译器。

循环String拼接反编译class文件

总结

通过上面的案例,我们得知编译器对字符串以"+"的拼接方式进行了优化,但不能太依赖编译器,在某些情况下(如循环拼接),编译器的优化可能并不好。所以应该养成良好的开发习惯,减少字符串"+"拼接的使用。

你可能感兴趣的:(String拼接优化)