我正在阅读“更好,更快,更轻便的Java”(作者Bruce Tate和Justin Gehtland),并且熟悉敏捷类型团队的可读性要求,例如Robert Martin在其干净的编码书中讨论的内容。在我现在所在的团队中,已明确告知我不要使用+运算符,因为它在运行时会创建额外的(和不必要的)字符串对象。

但是写在'04上的article讨论了对象分配如何与10条机器指令有关。 (基本上免费)

它还讨论了GC如何在这种环境下帮助降低成本。

使用+StringBuilderStringBuffer之间的实际性能折衷是什么? (就我而言,它仅是StringBuffer,因为我们仅限于Java 1.4.2。)

正如Tate的书中的几个示例所示,对我来说StringBuffer会产生难看的,可读性较低的代码。并且StringBuffer是线程同步的,这似乎具有其自己的成本,这些成本超过了使用+运算符的“危险”。

有想法/意见吗?

最佳答案

编译器将使用String串联转换为StringBuilder操作。

要查看编​​译器的工作方式,我将举一个示例类,对其进行编译,然后用jad对其进行反编译,以查看生成的字节码是什么。

原始类(class):

public void method1() {
    System.out.println("The answer is: " + 42);
}

public void method2(int value) {
    System.out.println("The answer is: " + value);
}

public void method3(int value) {
    String a = "The answer is: " + value;
    System.out.println(a + " what is the question ?");
}

反编译类:
public void method1()
{
    System.out.println("The answer is: 42");
}

public void method2(int value)
{
    System.out.println((new StringBuilder("The answer is: ")).append(value).toString());
}

public void method3(int value)
{
    String a = (new StringBuilder("The answer is: ")).append(value).toString();
    System.out.println((new StringBuilder(String.valueOf(a))).append(" what is the question ?").toString());
}
  • method1上,编译器在编译时执行了该操作。
  • method2上,String串联等效于手动使用StringBuilder
  • method3上,String串联绝对不好,因为编译器正在创建第二个StringBuilder,而不是重用前一个。

  • 因此,我的简单规则是,除非您需要再次串联结果,否则串联是好方法:例如在循环中或需要存储中间结果时。

    10-07 19:08
    查看更多