追加

2014-02-18 28 views
1

誰能請解釋什麼是下面執行與字符串追加

1)

{ 
    String comma=","; 
    return finalStr = "Hello"+comma+"Welcome"+comma+"to"+comma+"Stack"+comma+"overflow"; 
} 

2)

{ 
    return finalStr = "Hello,Welcome,to,Stack,overflow"; 
} 

多少字符串對象之間的區別的字符串將在第一個(1)塊中創建,將只有一個字符串finalStr h表示存儲H ello,Welcome,to,Stack,overflow的存儲位置,或者它將爲每個單詞創建多個位置,然後一旦添加,它將創建一個新的存儲位置。

+0

你一樣說自己會從你想要追加的地方取得所有的字符串值,即「Hello」+逗號它會創建6個字符串,然後將它們放在一起作爲一個新字符串,並將其變爲一個值,如果我誠實地使用了字符串生成器,該字符串生成器效率更高,並且內容是可變的,沒有創建副本:-) – XAMlMAX

+0

感謝您的回覆,:)。是的,我知道StringBuilder/StringBuffer然而,這個查詢只是爲了澄清JVM如何處理這種情況的字符串。 – Nikhil

+0

當我使用類似的東西:返回新的StringBuilder(「你好,」+「歡迎,」+「至」,「+」堆棧,「+」溢出「); }這會創建不同的字符串爲你好,歡迎,到...? – Nikhil

回答

3

在這兩種情況下,每個只會創建一個String對象。因爲編譯器足夠聰明,可以在編譯時理解串聯。這些是字符串文字,它們將在編譯時進行評估,並且每個案例只會創建一個字符串。

作爲每JLS

長字符串文字總是可以使用字符串 連接運算符+被分爲寫爲(可能括號內)的表達短塊和 [...]此外,一個字符串常量 引用類String的同一個實例。

  • 由常量表達式計算的字符串(§15.28)在編譯時計算,然後視爲文字。
  • 在運行時通過串聯計算的字符串是新創建的,因此是不同的。
+0

請問第一種情況下,只能創建一個字符串對象嗎?提前致謝。 – Nikhil

+0

@Nikhil:檢查更新後的答案 –

0

看看thisthis答案。編譯器會爲你優化一些東西。所以堅持最可讀的解決方案。

類似的問題已多次提出,如果您閱讀這些答案,您會發現一些有關您的問題的更多信息。

0

據我所知, 在第一投JVM不斷取得即時變量來像琴絃「你好」,「歡迎光臨」,等等

更進一步,每一個附加的操作需要另一個變量保存附加字符串例如「你好」,+「歡迎」...

另一方面,第二種情況,它爲String分配一次。謝謝。

0

使用javap的檢查編譯器是如何試圖優化代碼,我第一個場景,串聯發生使用StringBuilder最後的toString被稱爲

Code: 
     0: ldc   #16     // String , 
     2: astore_1  
     3: new   #18     // class java/lang/StringBuilder 
     6: dup   
     7: ldc   #20     // String Hello 
     9: invokespecial #22     // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 
     12: aload_1  
     13: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     16: ldc   #29     // String Welcome 
     18: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     21: aload_1  
     22: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     25: ldc   #31     // String to 
     27: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     30: aload_1  
     31: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     34: ldc   #33     // String Stack 
     36: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     39: aload_1  
     40: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     43: ldc   #35     // String overflow 
     45: invokevirtual #25     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     48: invokevirtual #37     // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
     51: astore_2  

方案2

52: ldc   #41     // String Hello,Welcome,to,Stack,overflow 
     54: astore_2  
     55: return