2014-05-13 64 views
1
public class D2 { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     String s1="java"; 
     String s2="ja".concat("va"); 
     System.out.println(s1==s2); 
    } 
} 

在s2中連接兩個字符串常量不會導致一個新的字符串對象(僅創建字符串對象,使用或燙髮參考像級聯S1新時)。請說明爲什麼o/p是錯誤的。字符串常量池查詢

+2

'concat' **會創建一個新的'String'。 – Maroun

+1

http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java?lq=1可能有幫助 – KonradOliwer

+0

concat是運行時語句,編譯器不能告訴運行時狀態的結果當它編譯代碼時,新的「java」將成爲新的字符串,與字符串池不一樣 – VinhNT

回答

4

在S2中串聯2個字符串常量不會產生一個新的String對象

,當它與字符串連接操作員執行是真的 - 但是這不是你在這裏做什麼。你正在手動調用String.concat,所以這是而不是一個常量表達式,而不是在編譯時評估。

如果你使用:

String s2 = "ja" + "va"; 

然後串聯會被編譯器執行,s1s2將指向同一個對象。

JLS section 15.28給出了導致常量表達式的細節,並且不包含包括方法調用。

+0

你是有史以來最快的JLS報價者。 – Maroun