当前位置: 首页 > 面试题库 >

Java:String concat vs StringBuilder-已优化,所以我该怎么办?

任伟
2023-03-14
问题内容

在这个答案中,它表示(暗示)无论如何都将String连接优化到StringBuilder操作中,因此,当我编写代码时,是否有任何理由在源代码中编写StringBuilder代码?请注意,我的用例与OP的问题不同,因为我正在串联/附加数十万行。

为了使自己更清楚:我很清楚每种代码的区别,只是我不知道是否值得实际编写StringBuilder代码,因为它的可读性较低,并且当它的较慢的表亲String类自动转换为反正编译过程。


问题答案:

我认为StringBuildervs 的使用+确实取决于您所使用的上下文。

通常使用JDK 1.6及更高版本,编译器会使用自动将字符串连接在一起StringBuilder

String one = "abc";
String two = "xyz";
String three = one + two;

它将编译String three为:

String three = new StringBuilder().append(one).append(two).toString();

这非常有帮助,为我们节省了一些运行时间。但是,此过程并不总是最佳的。举个例子:

String out = "";
for( int i = 0; i < 10000 ; i++ ) {
    out = out + i;
}
return out;

如果我们编译为字节码,然后反编译生成的字节码,则会得到类似以下内容的结果:

String out = "";
for( int i = 0; i < 10000; i++ ) {
    out = new StringBuilder().append(out).append(i).toString();
}
return out;

编译器已经优化了内部循环,但是肯定没有进行最佳的优化。为了改善我们的代码,我们可以使用:

StringBuilder out = new StringBuilder();
for( int i = 0 ; i < 10000; i++ ) {
    out.append(i);
}
return out.toString();

现在,这比编译器生成的代码更理想,因此,在需要高效代码的情况下,肯定需要使用StringBuilder/
StringBuffer类编写代码。当前的编译器不能很好地处理循环中的串联字符串,但是将来可能会改变。

您需要仔细查看以查看需要手动应用的位置,StringBuilder并尝试在不会降低代码可读性的位置使用它。

注意:我使用JDK
1.6编译了代码,然后使用该javap程序反编译了该代码,该程序吐出了字节代码。它很容易解释,并且在尝试优化代码时经常是有用的参考。编译器确实会在后台更改您的代码,因此查看它的作用总是很有趣!



 类似资料:
  • 问题内容: 我正在使用apache-httpclient-4.3。我将分析一个HTTP请求,尤其是查询字符串参数,但是 我不确定这意味着什么。我应该使用某些配置API的构造函数参数(那是什么?HostConfiguration作为类不再可用)。但是在构建阶段,我直接通过url传递查询参数: 我找不到不使用不推荐使用的方法从我的 请求 对象读回参数( var1,var2 )的方法,这种方法应该很简单

  • 关于编译器(GCC)所做的优化,标准做法是什么?每个选项(-O、-O1、-O2、-O3、-Os、-s、-fexpensive-optimizations)有什么不同,我如何决定什么是最优的?

  • 问题内容: 我的网站几乎完成了,除了最后一部分,我需要使图库页面支持ajax才能使用Ajax更改页码。 图库页面视图: Dajax / Dajaxice的记录不是很好…我只需要显示一些图像即可。 问题答案: 这是使用Dajax / Dajaxice的方法,这是为了在Django中简化AJAX: 根据文档安装Dajaxice和Dajax。文档似乎没有提及它,但是您也可以使用,即 pip instal

  • java开发三年,不会JVM调优,想学一下,有点迷茫不知道方向

  • 不清楚这样的问题该怎么起标题…… 这是一个简单的格式化长度的方法,以米为基础单位,这是我自己写的,请问有更简洁的写法吗?谢谢

  • 问题内容: 我有一个树结构,其中每个都有一个父级和一个。每个节点都有一个,我想在其中选择进行查询,即该节点和所有父节点的标题。如何编写此查询? 单个标题的查询就是这样,但是就像我说的那样,我希望它扩展到整个父母分支。 干杯 尼克 问题答案: 您不能使用HQL进行递归查询。看到这个。如前所述,它甚至不是标准的SQL。您有两种选择: 编写特定于供应商的递归本机SQL查询 进行多个查询。例如: 我肯定会