package deep;
public class StringTest {
public static void main(String[] args) {
final String fs = "Java";
String s = "Java";
final int fi = 7;
int i = 7;
String s1 = "JavaSE7";
String s2 = "Java" + "SE" + "7";
String s3 = fs + "SE" + "7";
String s4 = s + "SE" + "7";
String s5 = fs + "SE" + 7;
String s6 = fs + "SE" + fi;
String s7 = fs + "SE" + i;
System.out.println("s1 == s2:" + (s1 == s2));
System.out.println("s1 == s3:" + (s1 == s3));
System.out.println("s1 == s4:" + (s1 == s4));
System.out.println("s1 == s5:" + (s1 == s5));
System.out.println("s1 == s6:" + (s1 == s6));
System.out.println("s1 == s7:" + (s1 == s7));
}
}
運行結果:
s1 == s2:true
s1 == s3:true
s1 == s4:false
s1 == s5:true
s1 == s6:true
s1 == s7:false
對於s4而言,由於s不是final的,因此s指向的String對象在編譯期間不能確定,雖然在程序中指向“Java”,但是沒有人能夠保證s所指向的地址不會變,所以s1 == s4爲false,同理s7的i不是final的,也爲false。
要點總結:
- String類維護一塊特殊的區域,稱爲常量池。因爲String對象是不可改變的,因此沒有必要創建兩個相同的String對象。只需將String對象加入常量池,在需要的時候取出,這樣即可實現String對象的共享。
- 在程序中出現String編譯時常量(String字面常量與String常量表達式)時,會自動調用intern方法,如果常量池中含有相等的String對象,則直接返回常量池中的對象,否則將對象加入常量池中並返回該對象。
- 對於運行時創建的String對象(非String編譯時常量),會分配到堆中,系統不會自動調用intern方法拘留該對象,不過我們依然可以自行調用該對象的intern方法對該對象進行拘留。