StringBuilder / StringBuffer与“ +”运算符

我正在阅读“ 更好,更快,更轻便的Java ”(作者Bruce Tate和Justin

Gehtland),并且熟悉敏捷类型团队的可读性要求,例如Robert

Martin在其干净的编码书中讨论的内容。在我现在所在的团队中,已明确告知我不要使用+运算符,因为它会在运行时创建额外的(和不必要的)字符串对象。

但是,这篇写于‘04的文章讨论了对象分配如何与10条机器指令相关。(基本上免费)

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

什么是使用之间的实际性能的权衡+StringBuilder还是StringBuffer?(就我而言,这StringBuffer仅是因为我们仅限于Java

1.4.2。)

StringBuffer正如Tate的书中的几个例子所示,对我来说,结果导致丑陋,可读性差的代码。并且StringBuffer是线程同步的,这似乎具有其自己的成本,该成本超过了使用+运算符的“危险”

有想法/意见吗?

回答:

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

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

原始班级:

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编译器上执行编译时的操作。
  • method2String级联相当于手动使用StringBuilder
  • method3String级联的编译器创建第二个肯定是不好的StringBuilder,而不是重用前一个。

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

以上是 StringBuilder / StringBuffer与“ +”运算符 的全部内容, 来源链接: utcz.com/qa/419262.html

回到顶部