1. 程式人生 > >String的引用分析,String與StringBuffer的聯絡區別

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