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);
}
}
運行結果為:

原因:==比較的是他們在堆內存中的地址,s和s1的地址不同,所以輸出false。
第二個輸出true,是因為String為共享模式的一種應用,String pool中內容相同則直接指向,不會重新開辟內存空間。