2010-08-06 80 views
4

在我的項目有它使用StringBuffer的對象的某些代碼片段,和它的小部分如下在StringBuffer中追加或者+運算符?

StringBuffer str = new StringBuffer(); 

str.append("new " + "String()"); 

所以我在使用append方法和+操作的混淆。

即下面的代碼可以寫成

str.append("new ").append("String()"); 

所以是上面兩行相同?(功能肯定的,但)還是有他們的任何特殊用途?即性能或可讀性或???

謝謝。

回答

15

情況下,它更有效地使用第一種形式 - 因爲編譯器將其轉換爲:因爲它加到常量

StringBuffer str = new StringBuffer(); 
str.append("new String()"); 

一些更普遍的點,但:

  • 如果其中一個表達式不是一個常數,你會更好(性能明智)與兩個調用append,以避免創建無故
  • 如果您使用的是最新的Java版本,StringBuilder一般最好
  • 如果你馬上要追加一個字符串(你知道這是在施工時間什麼的),你可以中間串將其傳遞給構造函數
+0

只是爲了更多的理由 - StringBuilder的是首選,因爲它是不同步的(所以速度更快) 。 – 2010-08-06 08:47:06

0

第二種形式在性能方面效率最高,因爲只有一個字符串對象被創建並附加到字符串緩衝區。 第一種形式創建三個字符串對象1)爲「新」2)爲「新字符串」3)爲1)和2)的級聯結果。並將第三個字符串對象連接到字符串緩衝區。

+1

這就是我的想法......然後我讀了Jon Skeet的答案。 – 2010-08-06 07:26:54

6

實際上,字節碼編譯器會在調用StringBuffer的Java程序中替換所有涉及非常量的字符串並置。也就是說

int userCount = 2; 
System.out.println("You are the " + userCount + " user"); 

將被改寫爲

int userCount = 2; 
System.out.println(new StringBuffer().append("You are the ").append(userCount).append(" user").toString()); 

也就是說至少是觀察到的是,當反編譯Java類文件與JDK 5或6見this post編譯。

0

除非您正在使用併發系統,否則請使用StringBuilder而不是StringBuffer。它的速度更快,但不是線程安全的:)

它還擁有相同的API,因此它或多或少直查找/替換 -

+0

你不明白我相信的問題。 – GuruKulki 2010-08-06 12:45:58

+0

是的,我認爲我的回答可能會有點倉促。 – BjornS 2010-08-20 07:38:56