有三个分别是String,StringBuffer,StringBuilder。
1.String
String是不可变得对象,在堆中,String的改变会非常消耗内存,直接上图
所以只是在String str="hello" 变成String str="hello"+"world"堆就占了三个内存,还有两个是无引用对象,这太浪费了。所以在经常改变字符串值得String类型不要用String
2.StringBuffer与StringBuilder
StringBuffer和StringBuilder在修改的时候与String不同,StringBuffer与StringBuilder是在原有的基础上修改,不产生新的未使用对象,不会改变引用。也就是不会产生新对象,StringBuffer是线程安全的,但是StringBuilder是线程不安全的,StringBuffer在大多数情况下比String块,但是比不上StringBuilder。所以单线程建议用StringBuilder,多线程建议用StringBuffer。
StringBuffer和StringBulider只能new,不能进常量池。
每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量
3.在某些特殊情况下,String的速度会优于StringBuffer比如说
String S1 = "This is only a" + " simple" + " test";
StringBuffer Sb = new StringBuffer("This is only a").append(" simple").append(" test");
在这个例子中S1 String 对象的字符串拼接"This is only a" + " simple" + " test";会直接在编译期就合并成常量This is only a simple test
在jvm眼里S1是这样的 String S1 = “This is only a simple test”; 但是如果是
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;那么jvm还会按照老规矩去一步一步弄。并且创建一堆无引用对象。