2012-01-31 66 views
4
String a="A"; 
String b="B"; 
final String c="C"; 
final String d="D"; 

String e=a+b; 
String f=a+b; 
System.out.println(e==f);//false 

String g=c+d; 
String h=c+d; 
System.out.println(g==h);//true 

爲什麼這樣呢?字符串對象是在特殊的內存中創建的,稱爲字符串常量池。但是這裏最後一個變量的意義是什麼。最終參考變量的意義

+1

最終意味着變量一旦初始化就不能改變。間接地,這意味着編譯器可以使用變量靜態計算表達式的值。並且任何預先計算的字符串值都將被執行,從而允許'=='測試爲真。 – 2012-01-31 17:29:27

回答

1

編譯器看到的是c和d是final的,這意味着編譯器知道c和d永遠不會改變,因此編譯代碼爲

String g = "CD"; 
String h = "CD"; 

g和h因此是對相同的STring文字的兩個引用,它被實施。

他不能以同樣的方式優化e和f,因爲a和b不是最終的,因此可以改變。

+0

thanx!但你能告訴我什麼是interned字符串。 – 2012-01-31 17:40:43

+0

請參閱http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29 – 2012-01-31 17:42:16

1

final意味着您將不能在程序中稍後修改此字符串的值。也:

如果最終變量保存到一個對象的引用,那麼 的狀態下的對象可以通過操作在對象上改變,但 變量將始終指代相同的對象。 (source

4

最終關鍵字阻止您重新分配可變到不同的實例字符串的。因此,雖然String本身是不可變的,但除非明確標記爲final,否則可以更改引用它的變量。

現在,我對你在這裏遇到的確切語義的確切性不太確定。但一般來說,由於變量是最終的,現在可以將c+d視爲編譯器常量(它永遠不會具有除"CD"之外的值,該值是在編譯時計算的,它本身可以被視爲一個常量,實習字符串池。

1

Java編譯器看到你聲明瞭變量final(使他們常數,而不是變量),在編譯時計算c+d,並內化的結果。