2012-02-11 51 views
1

我使用toString()方法。但我不知道哪個FPGA實現是更好地使用和爲什麼:無法確定最有效的字符串連接

public String toString() { 
    StringBuffer buffer = new StringBuffer(); 
    buffer.append("Description: " + description + ";"); 
    buffer.append("Price: " + price); 
    return buffer.toString(); 
} 


public String toString() { 
    return "Description: " + description + ";" + "Price: " + price; 
} 

回答

7

個人而言,我會用後者 - 更清晰,實際上是高效:

  • 對於現代的Java版本,它會使用非同步StringBuilder類型,而不是StringBuffer
  • 它贏得了」 t構造不需要的"Price: " + price"Description: " + description + ";"的中間字符串,

在Java 5+下我期望後面的代碼是編輯爲:

public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append("Description: "); 
    builder.append(description); 
    builder.append(";"); 
    builder.append("Price"); 
    builder.append(price); 
    return builder.toString(); 
} 

重要的一點是第二種形式的清晰度 - 然而 - 我當然覺得它比第一種讀法簡單得多。有趣的一點是,有兩個連續的調用在編譯後的版本中添加字符串常量(我檢查過)。這將是更有效率 - 甚至更具可讀性,海事組織 - 寫:

public String toString() { 
    return "Description: " + description + ";Price: " + price; 
} 
3

兩者是完全一樣的 *,串聯與「+」操作符有效地擴展到StringBuffer的構建你給作爲第一個例子。

編輯:實際上它是一個StringBuilder,而不是Java5以來的一個StringBuffer。唯一的區別是後者是線程安全的,可以被多個線程訪問而無需額外的鎖定。儘管如此,它有一個同步開銷,你應該避免通過使用一個StringBuilder,只要你確定該對象不被不同線程共享。

(*)其實不是的,如果在追加方法,你巢額外級聯,可以創建不必要的臨時字符串,就像喬恩斯基特指出。沒有注意到你的代碼。我的錯。

+1

不一樣的。 StringBuffer更加優化。 – madmik3 2012-02-11 16:44:38

+1

較新版本的Java(5+)實際上使用['StringBuilder'](http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html)而不是['StringBuffer'] (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html)與'+'運算符進行「串」連接,以避免同步的開銷。 – Jeffrey 2012-02-11 16:47:08

+0

@ madmik3你有這方面的資源嗎? – 2012-02-11 17:05:46

0

這只是一個個人喜好,因爲它都是按documentation編譯相同:

編譯器使用字符串緩衝區來實現連接運算符+的二進制字符串 。例如,代碼:

x = "a" + 4 + "c" is compiled to the equivalent of: 

x = new StringBuffer().append("a").append(4).append("c") 
         .toString()  

還,我把你的@Override上述方法。

0

一般來說,」最好用StringBuffer或StringBuilder的。 StringBuffer和StringBuilder的區別在於StringBuffer是同步的。在你的例子中,我會推薦StringBuilder。

StringBuilder將分配的頻率較低,這可以在您執行此操作時提供顯着的速度和內存管理改進。

請仔細閱讀有關於這一主題在這裏更多:

Why to use StringBuffer in Java instead of the string concatenation operator