String有兩種實例化方式,一種是通過直接賦值的方式,另外一種是使用標准的new調用構造方法完成實例化。
1 public class StringDemo 2 { 3 public static void main(String[] args) 4 { 5 String str1="hello"; 6 String str2="hello"; 7 String str3="hello"; 8 9 System.out.println(str1==str2); 10 System.out.println(str1==str3); 11 System.out.println(str2==str3); 12 } 13 }
上述結果說明,使用String直接賦值后,只要是以后聲明的字符串內容相同,則不會再開辟新的內存空間。對於String的以上操作,在java中稱為共享設計,這種設計思路是,在java中形成一個對象池,在這個對象池中保存多個對象,新實例化的對象如果已經在
池中定義了,則不再重新定義,而從池中直接取出繼續使用。String就是因為采用了這樣的設計,所以當內容重復時,會將對象指向已存在的實例空間。
1 public class StringDemo 2 { 3 public static void main(String[] args) 4 { 5 String str1=new String("hello"); 6 String str2=new String("hello"); 7 String str3=new String("hello"); 8 9 System.out.println(str1==str2); 10 System.out.println(str1==str3); 11 System.out.println(str2==str3); 12 } 13 }
一個字符串就是一個String類的匿名對象,而如果使用new關鍵字,不管如何都會再開辟一個新的空間,但是此時,此空間的內容還是hello.所以上述代碼實際上是開辟了三個內存空間。