- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
根据名为 使用 .append 方法链而不是字符串连接的 Netbeans 提示
Looks for string concatenation in the parameter of an invocation of the append method of StringBuilder or StringBuffer.
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();
但就风格而言,我认为第一个看起来还不错。对我来说,单个对象创建的性能优势似乎很小。现在,如果不是 3 根琴弦,而是 10、20 或 100 根琴弦,我会说性能胜过风格。如果它在一个循环中,我肯定会使用字符串生成器,但我认为只需几个字符串就可以使用“草率”的方式使代码看起来更干净。但是……这里面潜伏着一个非常危险的陷阱!请继续阅读下面的内容(暂停以制造悬念...... dun dun dunnnn)
有些人说要始终使用显式字符串生成器。一个理由是您的代码将继续增长,并且通常会以与它已经相同的方式这样做(即他们不会花时间重构。)因此您最终会得到每条创建的 10 或 20 条语句当你不需要他们自己的 build 者。因此,为了从一开始就防止这种情况,他们说始终使用显式构建器。
因此,虽然在您的示例中,它不会特别快,但当将来有人决定他们想要一个文件扩展名或类似的东西时,如果他们继续使用字符串连接而不是 StringBuilder,他们'最终会遇到性能问题。
我们还需要考虑 future 。假设您在 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 变得比你更聪明时,你已经对性能造成了影响。所以你必须记住,有些事情是你不会想到的。
关于java - StringBuilder.append 链是否比字符串连接更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586266/
Racket 的 pict , 有几个 combinators for combining other pictures .这些文档包含一个很好的表格,说明其 *-append 组合器的工作方式: 这
我看过 Insert content into iFrame和他们的 fiddle http://jsfiddle.net/8VP4y/3/提出以下我遇到问题的代码。 我已经为下面的问题创建了一个 j
我有一个显示非常奇怪结果的微基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations =
我想知道是否有人可以回答我使用 StringBuilder 对象在 java 中执行这些语句中的哪一个会更好: 使用 .append(string1 + string 2) 对比 .append(st
假设我有两个相同类型的流。是否可以将一个流 append 到另一个流而无需事先将它们转换为列表? 例子: Stream ms = ...; Stream ns = ...; return ms.app
我有以下有效的 jQuery 代码,但它让我思考是否可以对正在 append 的内容执行 append 操作,而无需指定我想要 append 的内容。 append().append() 并没有达到目
这是为了显示诊断页面的检查。我有一个 .append(not_ok) 但当 swf 文件加载 100% 时,我想删除 not_ok 附加,然后添加一个 .append(ok)。 function ca
x = [[1,2],[2,3],[10,1],[10,10]] def duplicatingRows(x, l): severity = x[l][1] if severity =
我有一个列表,我正在尝试将数据注入(inject)其中。列表如下所示 data2 = ['TECH2_HELP', 'TECH2_1507', 'TECH2_1189', 'TECH2_4081',
为了有效地进行一些 DOM 操作,我分离了一个元素。在这个过程中,我遇到了一个有趣的情况: var $holder = $("#d"); var $wrapper = $("").css("borde
我遇到了图片在移动设备上加载速度不够快的问题。我的元素有一个图像和一个按钮。单击该按钮时,图像向下滑动,另一幅图像从顶部滑动以取代它。这是代码 html CSS .moveF
我正在编写一个包含 10 个遗愿 list 的简单哈希表。使用内置的 hash() 计算索引,然后对表大小取模。但是,当我尝试将该对象 append 到该索引处的存储桶列表时,它会 append 到每
我是 LISP 的新手,我正在尝试处理类的 cond 语句。目前,我正在尝试检查传递的值是否为列表,如果是,则将字母 d append 到列表中。 这是我的代码: (defun test(L) (li
我正在使用 Jquery 将数据 append 到 div。但是,append 语句之后页面上没有显示任何内容。 我尝试使用 $(window).load 来确保页面已加载,但这仍然不起作用。 HTM
我有以下代码; function SetupDropdowns() { var PrevType; dropdown1 = document.getElemen
我想在 smarty 中创建一个数组并在其中执行 append 功能!就像我在 smarty 模板中声明一个变量(如 {assign var=sizearr value=''} )然后我想在循环中向其
请考虑以下代码片段: var ul = $(".list_b").find("li").remove().end(); $.each(Sites, functi
我的日志记录配置中有两个 appenders。其中之一在 ERROR 事件上发送电子邮件。 一个类,我无法控制,垃圾邮件 ERROR 消息。所以我仍然想要那些消息,但不是在两个 appenders 中
我正在尝试制作 editText,我要在其中插入一些文本。在每三个字符之后,我想插入破折号。 例子: 类型:123 结果:123- 现在当光标在破折号后面并且你按下删除键时,我想删除破折号和破折号
当我尝试 append 简单的“hello”时,它会被 append ,但很快就会自动删除。仅当我在下面给出的表单中使用它时,才会出现此问题,如果删除该表单,则不会出现问题,并且 hello 会正确
我是一名优秀的程序员,十分优秀!