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

是StringBuilder.append链比字符串连接更有效吗?

华聪
2023-03-14
问题内容

根据Netbeans的提示,名为 .append方法的使用链而不是字符串连接

在调用StringBuilder或StringBuffer的append方法的参数中寻找字符串连接。

是StringBuilder.append()确实比字符串连接更有效吗?

代码样例

StringBuilder sb = new StringBuilder();
sb.append(filename + "/");

StringBuilder sb = new StringBuilder();
sb.append(filename).append("/");

问题答案:

您必须在可读性和功能之间取得平衡。

假设您具有以下条件:

String str = "foo";
str += "bar";
if(baz) str += "baz";

这将创建2个字符串生成器(实际上只需要1个),外加一个临时的字符串对象。如果您去了,您将更有效率:

StringBuilder strBuilder = new StringBuilder("foo");
strBuilder.append("bar");
if(baz) strBuilder.append("baz");
String str = strBuilder.toString();

但是从风格上来说,我认为第一个看起来还不错。对我来说,创建单个对象的性能优势似乎很小。现在,如果您有10个,20个或100个字符串,而不是3个字符串,那么我认为性能胜过样式。如果是循环的话,那么可以肯定我会使用字符串生成器,但是我认为只需几个字符串就可以使代码看起来更整洁。但是…里面有一个非常危险的陷阱!在下面阅读
(暂停以建立悬念… dun dun dunnnn)

有些人说总是使用显式字符串生成器。一个基本原理是您的代码将继续增长,并且通常会以与现在相同的方式进行增长(即,它们将不需要花费时间进行重构。)因此,您最终要创建每条创建的10或20条语句自己的构建器,当您不需要时。因此,从一开始就防止这样做,他们说始终使用显式生成器。

因此,在您的示例中,它并不会特别快,当将来某人决定结束时想要文件扩展名或类似的内容时,如果他们继续使用字符串连接而不是StringBuilder,他们将会最终遇到性能问题。

我们还需要考虑未来。假设您正在用JDK 1.1制作Java代码,并且具有以下方法:

public String concat(String s1, String s2, String s3) {
    return s1 + s2 + s3;
}

那时,它会很慢,因为StringBuilder不存在。

然后,在JDK 1.3中,您决定通过使用StringBuffer(StringBuilder尚不存在)使其更快。你做这个:

public String concat(String s1, String s2, String s3) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    sb.append(s3);
    return sb.toString();
}

它变得更快。太棒了!

现在,JDK 1.5出现了,随之而来的是StringBuilder(比StringBuffer快)和自动转换

return s1 + s2 + s3;

return new StringBuilder().append(s1).append(s2).append(s3).toString();

但是,由于显式使用StringBuffer,因此无法获得此性能优势。因此,通过变得聪明,当Java比您聪明时,您会导致性能下降。因此,您必须记住,有些事情是您不会想到的。



 类似资料:
  • 问题内容: 我可以猜测浏览器已针对最新版本进行了优化,但是如何做到这一点呢?我们可以说串联字符串时最好使用吗? 更新资料 因此,在现代浏览器中,对字符串串联进行了优化,因此使用符号比要 串联 字符串时使用符号要快。 但是@Arthur指出,如果您实际上想使用分隔符连接字符串,则速度会更快。 问题答案: 浏览器字符串优化已更改了字符串串联图片。 Firefox是第一个优化字符串连接的浏览器。从1.0

  • 问题内容: 在ES6中使用字符串连接或模板文字时,HTML代码生成在现代浏览器中运行的速度是否可测得更快? 例如: 字符串串联 模板文字 问题答案: 目前看来,字符串连接速度更快:http : //jsperf.com/es6-string-literals-vs-string-concatenation 我测试过的是在#enable-javascript-harmony启用了该标志的V4 4.3

  • 问题内容: 在JavaScript中,我有一个包含许多迭代的循环,并且在每个迭代中,我正在创建一个包含许多运算符的巨大字符串。有没有更有效的方式来创建字符串?我正在考虑创建一个动态数组,在该数组中不断向其中添加字符串,然后进行联接。谁能解释并举例说明最快的方法吗? 问题答案: 基于JSPerf的基准测试,似乎是使用最快的方法,尽管不一定在每个浏览器中都使用。 为了在DOM中构建字符串,最好先将字符

  • 问题内容: 我突然在我的java-app(使用NetBeans作为IDE)中创建记录器时,突然看到一条警告:“记录器中字符串连接使用效率不高”。 我的原始代码是 但是NetBeans建议将此代码转换为模板(“模板”在这里意味着什么?),并提供以下代码: 这两种串联方式有什么不同,尽管我从未使用过后者。 干杯。 问题答案: 我会忽略该警告(如果可能,请将其关闭)。串联的效率不是那么低,因为现代编译器

  • 我目前正在使用以下连接字符串连接到数据库(数据库与ServerIP在同一台服务器上): 这在asp中使用时连接良好。网(我已经手动创建了dbUserId,并从sql server management studio为其分配了dbUserPassword。dbUserId是数据库“dbName”的所有者) 我在另一台电脑上有一个java swing应用程序,需要连接到同一个数据库。我正在使用sqlj

  • 我使用ServiceBustigger创建了一个Azure Function应用程序(监听主题订阅)。很好。但是现在我试图制作一个QueueTrigger来监听一个简单的队列,但是我得到了以下错误。 我也是这样做的。我在Visual Studio中创建了一个新项目,并将其指向我在Azure上的存储帐户。指定了队列名称。队列存在。我尝试创建一个新的共享访问策略。已将连接字符串复制到本地。设置。jso