String str = "a";
1個,在常量池中建立了一個字串物件。
String str = new String("a");
2個,在常量池中建立了一個字串物件"a",在堆中開闢了一個空間又放了一個"a"。
String str = "a"+"b";
1個,在編譯期,jvm將"a"+"b"自動識別成"ab",因此只建立了一個物件,放在常量池中。
String a="a";//建立一個 String b="b";//建立一個 String ab1 = a+b;//建立一個 String ab2= a+b;//建立一個
4個,第三和第四行,各建立了一個物件,因為對於編譯器來說,建立ab1和ab2時候,a和b的值被當做是不確定的,所以各自開闢空間建立物件
final String a="a";//建立一個放常量池 final String b="b";//建立一個放常量池 String ab0=a+b;//建立一個放常量池 String ab1=a+"b";//不再建立 String ab2 = "ab";//不再建立
3個,在String前邊加個final,後邊再用這個物件的時候,對編譯器來說a的值是確定的,和"a"是一個東西都是“字面常量字串”。
以下轉自:http://blog.csdn.net/s1491695565/article/details/51833579
//此時str1與str2相當於變數,而不是常,因為塊是在執行時才能確定,在編譯時不能確定 final static String str1; final static String str2; static { str1 ="aaa"; str2 ="bbb"; } public static void main(String[] args){ String str3 = str1 + str2; String str4 ="aaabbb"; System.out.println(str3==str4); //輸出為false } String str=" ";與String str=new String(); str=" "會放入池中,但new String()不會放入池中。
String的intern()方法
“當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(該物件由 equals(Object) 方法確定),則返回池中的字串;否則,將此 String 物件新增到池中,並且返回此 String 物件的引用。它遵循對於任何兩個字串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern() == t.intern() 才為 true”,這是jdk文件原文註解。