2014-06-05 64 views
1

我對java字符串池有一些疑問。java字符串池中的內容

String s1 = "welcome" + " to" + " java"; 
String s2 = new String("HTML"); 

在上述情況下,

我的問題是一樣的中間琴絃「歡迎」添加到池中與否。 例如,在我的思想,當前字符串池有內容如下

"welcome" 
" to" 
"welcome to" 
" java" 
" to java" 
"welcome to java" 

,請告訴我,如果我的想法是錯誤的。

+1

專家3人,3個不同的答案,OK,現在只有兩個答案。 –

+0

現在一個。 hehehe :) –

回答

1

編譯器將多個常量字符串連接爲單個字符串。上面的代碼因此類似於

String s1 = "welcome to java"; 
String s2 = new String("HTML"); 

因此存在由上述代碼存儲在池2個字符串:"welcome to java",和"HTML"

+0

在我學習的幻燈片中,他們只是說只有具有簡寫符號的字符串纔會存儲在字符串池中。那麼你是說String對象來自正式定義,它也存儲在String池中? – user3473222

+0

@ user3473222是的你是對的。使用'new'關鍵字創建的字符串將存儲在Java堆中。只有帶簡寫符號的字符串纔會存儲在Java堆中的字符串池中。 –

+1

@downvoter - 自己解釋.. – TheLostMind

1

感謝JB Nizet FO這個.. :)

 String s1 = "Hellothere";// Hellothere added to SP 
     String s2 = "Hello" + "there"; //Hellothere "already" present in SP 
     System.out.println(s1 == s2); // true. And yes, I am intentionally comparing Strings using"==" 
      String s3 = s1 + s2; 
     String s4="HellothereHellothere"; 
     System.out.println(s3==s4);//False.. HellothereHelloThere NOT added to SP 
+0

爲什麼'System.out.println(s3 == s4);'給出'false'作爲輸出?是因爲's3'是用其他變量初始化的,而不是簡寫和符號? –

+0

@MehmetSedatGüngör - 因爲s3和s4是不同的。 S4在Stringpool上,而S3在堆上。 – TheLostMind