浅析String、StringBuilder、StringBuffer区别

String对象是不可变的。查看jdk文档你会发现,String类中每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,并包含修改后的内容。而最初的String对象没有改变。

public class TestString {
    public static void main(String[] args) {
        String str = "aaaa>";
        str += "bbbb>"+"cccc>";
        System.out.println(str);
    }
}

String对象具有只读特性,所以指向它的任何引用都不可能改变它的值,也就不会对其他的引用有什么影响。

String的不可变性就带来了效率问题,以上代码是这样工作的:String对象在拼接字符串的时候会调用StringBuilder的append()方法,生成新的String对象,以包含"bbbb>"和str连接后的字符串,然后该对象再与"cccc>"相连生成一个新的String对象,以此类推。

通过查看String源码也能看到结果


也可以通过jdk自带的工具javap来反编译以上代码,命令如下:

javac TestString.java

javap -c TestString.class



  编译器自动引入了StringBuilder类,虽然我们代码中并没有使用它,但是编译器去主动使用了,因为它更加高效。在这个例子中最终会生成3个String对象。


总结:

1.String是不可变对象,每连接一个字符串就会多生成一个对象。

2.StringBuilder是可变的字符串操作类,效率最高,但不是线程安全的

3.StringBuffer是java SE5引入的可变的字符串操作类,是线程安全的,开销就会大,效率不如StringBuilder


posted @ 2022-04-29 19:05  码猿笔记  阅读(24)  评论(0编辑  收藏  举报