这三者的区别主要有两方面:运行速度和线程安全
String
String 不是Java的基本数据类型,String类的定义:
public final class String extends Object()
1.通过定义可以看出,String类是final定义,所以不可以被继承
2.String值不能修改,因此,当编辑String变量内容时,实际上是新建一个String类型变量,然后将String指向新的地址。
String str = "abc";
str+="de";
在上述代码中,首先创建对象str,值为abc,然后第二步重新创建一个对象值为abcde,然后将新对象地址赋给str,并且将第一个对象通过GC回收。
String str = "abc" + "de";
String str1 = "abcde";
上述两行代码的执行效率相同,第一行不会创建两个对象
String str = "abc";
String str1 = new String("abc");
String str2 = "abc";
上述三行代码中,第一行和第二行值虽然相同,但内存地址却不同,因为new String()会新建一个对象。
第一行代码和第三行代码的值相同,地址也相同,因为在个str2赋值时,会先找是否有值为“abc"的对象,如果有则将地址赋给str2,如果没有则新建。
总结:当需要重复修改内容时,String的效率最低。
StringBuffer
StringBuffer
- StringBuffer可以new StringBuffer(),在构造函数中,可以直接给出大小,也可以直接给出要赋的值
- StringBuffer对象的值可以直接通过append进行增加,所以相比String,少了新建对象和垃圾回收,因此效率更高
- StringBuffer在初始化时,如果没有指定大小和值,会有个初始大小为10;如果最终要增加的值较大时,最要在初始化时估算一个大小进行初始化,以减少扩容次数。
- StringBuffer的方法有synchronized修饰,因此是线程安全的
总结:由于StringBuffer对象内容可以修改,因此当重复修改内容时,StringBuffer的效率远高于String,但由于有同步锁,因此效率可能低于StringBuilder。
StringBuilder
StringBuilder和StringBuffer大致相同,但他没有synchronized,所以不是线程安全,效率也最好,但由于不是线程安全,因此在多线程操作时应注意使用。