String是引用類型,String類中的內容一旦聲明則不可改變,它是Java中共享模式一種應用。

String有兩種賦值方式:

1 直接賦值    String str=abc;   句柄指向新開辟的內存空間

2 new開辟空間    String str=new String(”abc”);

abc”是匿名對象,那么在堆內存中就會有塊空間是“abc”,緊接著new String("abc") 使用new在堆內存中又開辟了一個空間“abc,最后String str1 = new String("abc") ;代碼將最后生成的“abc”內存地址指向str1,最早的一個“abc”就沒使用上,如圖所示:

 

來看下面代碼:

public class Demo {

 

   

    public static void main(String[] args) {

       String s=new String("abc");

       String s1="abc";

       String s2="abc";

       System.out.println(s==s1);

       System.out.println(s1==s2);

      

    }

 

}

運行結果為:

 

原因:==比較的是他們在堆內存中的地址,ss1的地址不同,所以輸出false

    第二個輸出true,是因為String為共享模式的一種應用,String pool中內容相同則直接指向,不會重新開辟內存空間。