2014-12-02 30 views
2

我有下面的代碼行:如果我有足夠的內存,我應該使用stringBuilder重寫字符串concat嗎?

return ROOT_USER_IMAGE_PATH + File.separator + userId 
     + File.separator + nameWithoutExtension + "__" 
     + new SimpleDateFormat("yyyyMMddhhmm").format(new Date()) 
     + extension; 

在代碼審查我的同事說,我取代它使用StringBuilder

我知道它會工作得更快,但我認爲這種增強功能絕對是次要的,沒人能感覺到。

當我們有很多記憶的時候,你認爲在現代情況下如何與未成年人一起鯉魚有什麼意義?

+3

如果你已經測試過它,它的工作原理,然後讓你的同事建議的改變有點浪費時間。但是,最好不要寫這樣的代碼。老實說,我會用'String.format()'來寫這個 - 比'StringBuilder'更清晰。 – 2014-12-02 20:00:46

回答

6

什麼都不做。編譯器將在幕後爲您使用StringBuilder

+0

** nameWithoutExtension **不是最終的 – gstackoverflow 2014-12-02 20:02:18

+1

這無關。編譯器會自動在字節碼中使用一個'StringBuilder'來連接非文字字符串。 – 2014-12-02 20:03:22

+0

這是Java 6的實際嗎? – gstackoverflow 2014-12-02 20:11:30

2

您的版本已經更短,更具可讀性。不需要用StringBuilder代替,尤其是編譯器很可能會優化它以使用StringBuilder

如果您還檢查生成的字節碼,使用StringBuilderappend ing爲您的情況下的每個字符串可能導致更多的字節碼比簡單的連接。

樣的字節碼使用字符串連接:

aload_1 
invokestatic java/lang/String/valueOf(Ljava/lang/Object;)Ljava/lang/String; 
invokespecial java/lang/StringBuilder/<init>(Ljava/lang/String;)V 
getstatic java/io/File/separator Ljava/lang/String; 
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
aload_2 
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String; 
areturn 

使用StringBuilder

invokespecial java/lang/StringBuilder/<init>()V 
astore_3 
aload_3 
aload_1 
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
pop 
aload_3 
getstatic java/io/File/separator Ljava/lang/String; 
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
pop 
aload_3 
aload_2 
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
pop 
aload_3 
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String; 
areturn 

通常情況下,它的效率更高在一些字符串正在修建一個循環使用StringBuilder,或者當字符串預期通過插入或替換字符而改變時。

相關問題