2012-02-11 43 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