浅析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