2015-02-24 53 views
3
public static void main(String [] args){ 
    String s = "java"; //line 1 
    s.concat(" SE 6"); //line 2 
    s.toLowerCase(); //line 3 
    System.out.print(s); //line 4 
} 

這個問題的答案是「4」。我認爲這將是「3」。我的困惑是第3行,它再次創建「java」字符串,但不知道字符串常量池中已經存在「java」字符串,爲什麼再次創建它?創建多少個Java字符串?

+1

字符串在Java中是不可變的,所以's.toLowerCase()'返回一個新的String對象。 – Ocracoke 2015-02-24 16:14:22

+4

@Ocracoke - 沒有。他不會重新分配由'concat'返回的值,所以s將是「java」,然後是「java」,toLowerCase()'將返回相同的字符串「java」 – TheLostMind 2015-02-24 16:23:31

+0

@TheLostMind啊,只是看着代碼對於'toLowerCase()'來說,當它發現什麼都不做時,就會看到'return this'這行。我的錯。 – Ocracoke 2015-02-24 16:37:09

回答

5

3 Java字符串已創建。

1. "java" -> Goes into String constants pool // will be added if no already present 
2. " SE 6" --> Goes into String constants pool? 
3. java SE 6 --> Goes on heap (call to concat)// Note : You are not re-assinging the value returned from concat() So s will still be "java" 
** toLowerCase() \\ does nothing in your case since "java" is already present. toLowerCase retruns the same "java" object (as there is no modification required to turn it into lowercase) 
+2

步驟3中返回的對象是否有對兩個字符串的引用,所以這就是爲什麼它不會自己計算爲字符串? – 2015-02-24 16:29:14

+0

@SotiriosDelimanolis - 我的意思是一樣的。由於字符串中沒有大寫字符,因此將返回相同的字符串。編輯答案使其更清晰。 :) – TheLostMind 2015-02-25 06:04:03

5

Java知道「java」字符串已經存在於常量池中,所以不需要再次創建對象?

其實,這不是"java"串存在於池中,但"Java"(大寫)。如果確實是"java",則toLowerCase()會識別它,並返回原始字符串。但是,因爲返回值(即全部用小寫"java")沒有原始字符串(即"Java"大小寫混合的)相匹配,需要創建一個新的String對象,使數到4

編輯:後,編輯問題答案會改變:現在您已將"Java"更改爲"java",因此創建的對象數爲3,因爲Java String有一個優化,當字符串已經是小寫字符時,將返回原始字符串toLowerCase。因此,第1行創建一個字符串對象"java",第2行創建兩個字符串對象" SE 6""java SE 6",第3行和第4行不創建任何其他對象。

+0

這些行數不是我如何計算對象的! – user1529412 2015-02-24 16:21:18