假设字符串 a 和 b:
a += b
a = a.concat(b)
在引擎盖下,它们是一样的吗?
这里是 concat 反编译作为参考。我也希望能够反编译 +
运算符,看看它有什么作用。
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
原文由 shsteimer 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,不完全是。
首先,语义上略有不同。 If
a
isnull
, thena.concat(b)
throws aNullPointerException
buta+=b
will treat the original value ofa
好像是null
。此外,concat()
方法仅接受String
值,而+
运算符将静默地将参数转换为字符串(使用toString()
方法 —对象)。所以concat()
方法接受的内容更加严格。要深入了解,请使用
a += b;
编写一个简单的类现在用
javap -c
(包含在 Sun JDK 中)进行反汇编。您应该会看到一个列表,其中包括:所以,
a += b
相当于concat
方法应该更快。但是,如果字符串越多,StringBuilder
方法就会胜出,至少在性能方面如此。String
和StringBuilder
(及其包私有基类)的源代码可在 Sun JDK 的 src.zip 中找到。您可以看到您正在构建一个 char 数组(根据需要调整大小),然后在创建最终String
时将其丢弃。在实践中,内存分配速度惊人。更新: 正如 Pawel Adamski 所说,最近的 HotSpot 的性能发生了变化。
javac
仍然产生完全相同的代码,但字节码编译器作弊。简单的测试完全失败,因为整个代码体都被丢弃了。总结System.identityHashCode
(不是String.hashCode
)显示StringBuffer
代码有一点优势。下一次更新发布或您使用不同的 JVM 时可能会发生变化。来自 @lukaseder , HotSpot JVM 内在函数列表。