String的引用分析,String與StringBuffer的聯絡區別
我們先來看兩段程式碼:第一段
@Test
public void test() {
String b = "abc";
String c = "abc";
String e = c;
String f = b;
System.out.println(b==c);
System.out.println(b==e);
System.out.println(b==f);
System.out.println(c==e);
System.out .println(c==f);
System.out.println(e==f);
上述程式碼全部輸出為true,b,c,e,f均指向abc,且無堆記憶體空間的開闢
分析bc:對於建立b,會在方法區新建立空間儲存abc,且讓b指向這個abc;而對於c,會先去方法區已建立的物件裡尋找是否有相同的值,有的話就使用地址,由於b的值和c的值是相同的,所以b是直接引用c的值,所以b==c返回的是true。
第二段:
@Test
public void test() {
String o = new String("abc");
String a = o;
String p = "abc" ;
System.out.println("前 a==o: "+(a==o)); //① true
System.out.println("前 a==p: "+(a==p)); //② false
System.out.println("前 o==p: "+(o==p)); //③ false
o = "abc";
System.out.println("前 a==o: "+(a==o)); //④ false
System.out.println("前 a==p: "+(a==p)); //⑤ false
System.out .println("後 o==p: "+(o==p)); //⑥ true
}
分析:
String o = new String("abc")
在堆記憶體空間開闢一個String物件,在方法區開闢一個空間,儲存abc;並且使得o指向String物件,String物件指向abc
String a = o;
將o的記憶體地址(這個記憶體地址是String物件的)傳達給a,使得a也指向String物件,當然String物件也指向abc
String p = "abc";
由於方法區內已有abc,所以不再建立新的空間,而是p直接指向abc
所以①②③為true,false,false
o = "abc";
此時o不再指向String物件,而是指向方法區的abc,其值是方法區的abc的記憶體地址。a,p不變
所以④⑤⑥為false,false,true
分析結果圖如下:
String引用分析結束,接下來是String與StringBuffer的聯絡區別(部分擷取自菜鳥教程http://www.runoob.com/java/java-stringbuffer.html)
①String是一個特殊的類,因為它被final修飾符所修飾,是一個不可改變的類(其實基本型別的各個包裝類也被final所修飾)。
②當對字串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。和 String 類不同的是,StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。
③StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是執行緒安全的(不能同步訪問)。
由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程式要求執行緒安全的情況下,則必須使用 StringBuffer 類。
public class Test{
public static void main(String args[]){
StringBuffer sBuffer = new StringBuffer("菜鳥教程官網:");
sBuffer.append("www");
sBuffer.append(".runoob");
sBuffer.append(".com");
System.out.println(sBuffer);
}
}
輸出值為:菜鳥教程官網:www.runoob.com