前言
String和StringBuffer本質上都是修飾字符串的只是含義不同 StringBuffer叫做字符串緩沖區
首先看下string類的例子
public class Work1 { public static void main(String[] args) { String s = "hello"; String s1 = s.substring(3); System.out.println(s==s1);//結果為false } }
在來看下StringBuffer類的例子
public class Work1 { public static void main(String[] args) { StringBuffer ab1 = new StringBuffer(); StringBuffer ab2 = ab1.append("hello"); System.out.println(ab1==ab2); //結果為true } }
在來看下二者的內存分布圖如下:
根據內存分布圖來看 String 除了直接String s="hello" 這種方式之外不會創建新的對象 其它的不管是通過方法返回的String類型還是直接利用構造函數創建出來的字符串還是通過變量拼接(二邊只要有一個變量拼接)都需要創建新的對象
而StringBuffer通過StringBuffer里面的方法 操作 返回一個StringBuffer類型的變量跟原StringBuffer變量是相等的 。
String stt1 = new String("hello"); String stt2 = new String("world"); System.out.println(stt1+stt2); String stt1 = "hello" String stt2 = new String("world"); System.out.println(stt1+"world"); //上面二種拼接都是可以的 //這種是可以拼接的 StringBuffer ab1 = new StringBuffer(); StringBuffer ab2 = ab1.append("hello"); System.out.println(ab2+"hello"); //這種是不可以拼接的 StringBuffer ab1 = new StringBuffer("abc"); StringBuffer ab2 = ab1.append("hello"); System.out.println(ab2+ab1);
最后總結三點不同:
1、String可以用+算術運算符拼接字符串(不管是二邊有一個變量字符串還是都是常量字符串都可以拼接)StringBuffer不可以(除了二邊只要有一個常量字符串對象就可以拼接 例如 ab2+"hello")
2、String表示線程不安全 執行效率高 StringBuffer相反
3、String對象中的值是不可變的 StringBuffer中的值是可變的(也就是可以通過方法修改原來的StringBuffer變量並賦值給一個新的StringBuffer變量 二者之間是相等的)
4、String創建對象時可以String a = "abc" 但是 StringBuffer不能直接這樣創建 需要StringBuffer pj1 = new StringBuffer("abc");