我想执行两个的连接String
:
String nombre = adornoF.getNombre();
String prefijo = ga.getsid();
String all = nombre + prefijo;
只要getNombre()
他们getsid()
返回一个String
.
可以吗还是有更好的方法?
我想执行两个的连接String
:
String nombre = adornoF.getNombre();
String prefijo = ga.getsid();
String all = nombre + prefijo;
只要getNombre()
他们getsid()
返回一个String
.
可以吗还是有更好的方法?
连接两个的方法
String
是:使用运算符
+
:通过concat()方法:
使用StringBuffer类和 append() 方法:
使用StringBuilder类和append()方法:
在所有 3 种情况下,您都会得到相同的结果,但是作为一个好习惯,最好使用StringBuilder连接缓冲区中的文本并
String
使用toString()
.安卓文档:
没关系,你也可以
concat()
像这样使用java函数:还有一种方法是使用
StringBuilder
在循环中使用更佳
StringBuilder
在操作系统上提取
这是更好的讨论显然取决于它的使用,如果它只使用一次则更好,
+
但如果它是从一个循环构建一个链,那么更好StringBuilder
很好,不要过早的改变它。
在制作程序时,有几件事很重要,其中包括:
第三点总是很重要。在所有代码行中,重要的是他们按照对他们的期望去做。
其他两点并不总是那么重要。如果你的字符串连接消耗了你程序 0.01% 的时间,那么优化它你将收获很少。如果您消耗20%,那么它是值得的。
要使程序正确,使用简单易懂和易于维护的代码很重要。
您编写的代码:
满足这些要求。
可能更有效的代码,例如:
这并不难理解。但是如果你总是这样编程,一个有 10,000 行的程序将有 40,000 行,你会注意到其中的差异。
为什么要损害程序的可读性以获得可能可以忽略不计的效率增益?
结论:努力使您的代码保持简单、可维护和正确。
当它运行良好时,将其传递给分析器并优化瓶颈。
在这种情况下 StringBuilder 更快吗?
让我们假设,无论出于何种原因,我们得出的结论是您的表现至关重要。使用 StrinBuilder 更快吗?
让我们考虑带有 + 运算符的代码:
和 StringBuilder 的代码:
这是 + 运算符的字节码代码:
这是 StringBuilder 案例的字节码代码:
出来的数字(从 1 到 14,以及字母的数字)不是真实的,我已经修改了它们以使解释更容易理解。
首先突出的是 + 运算符代码被编译为 StringBuilder。
第二件事是 StringBuilder 代码具有与 + 运算符相同的 14 字节码指令(没有字母 boc 的行)。除了参数的差异,如第 8 行(astore_0 或 astore_2),但这种差异不影响性能。
真正影响的是 StringBuilder 代码具有的 6 个额外字节码指令(7b、8b、9b、9c、11b 和 11c)。
传送到 Android 设备的不是 JVM 字节码。这将转换为 DEX。然后是本机代码。但就我所见,已经很清楚了。如果这些中间步骤之一是优化 StringBuilder 代码,它最多会达到优化的 + 运算符代码,但在任何情况下都不会改进它。
结论: StringBuilder 在这种特殊情况下速度较慢。
我们是否应该拒绝 Stringbuilder 并始终使用 + 运算符?
当然不是。要连接两个字符串,+ 运算符更好,但考虑一个包含 1000 个字符串的数组的情况,您希望将它们全部连接成一个字符串。
我敢说使用 StringBuilder 会更快:
它不仅会更快(1),而且该代码也与使用 + 运算符的替代方案一样易于理解和维护:
(1) 除非编译器也能够优化 + 运算符代码。
没有人提到的一种选择是使用
String.format
:结果:
好吧,让我们对所有四个人进行挑战。让我们说:
让我们连接一个字符串:
让我们看看哪一个更有效。
每个测试都使用代码,因为它在内部工作。
注意:
测试是在 PC 上用 Java 完成的。在 Android 上运行它会很有趣(可能使用更少的值,例如 10,000 个字符串)......看看结果会很有趣。
原始代码来自100,000次。对于其他值更改变量
ITERATION
:代码:
结果(一)
结果 (b)
结果 (c)
结果(d)
结果(e)
我建议你使用
StringBuilder
.java的问题
Strings
在于它们是不可变的,每次使用它们时都会创建一个对象。对于少数进程,成本无关紧要,但对于大型项目,StringBuilder
它可以提供更好的性能,进而减少内存消耗。(尽管 GarbajeCollector 会处理后者)
前任: