假设字符串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);
}
}
Niyaz是正确的,但也值得注意的是,特殊的+运算符可以被Java编译器转换为更有效的东西。 Java有一个StringBuilder类,它表示一个非线程安全的、可变的String。 当执行一堆字符串连接时,Java编译器会默默地将其转换为
String a = b + c + d;
转换成
String a = new StringBuilder(b).append(c).append(d).toString();
这对于大字符串来说,效率明显更高。 据我所知,当你使用concat方法时,这种情况不会发生。
然而,当把一个空的字符串连接到一个现有的字符串上时,concat方法的效率更高。 在这种情况下,JVM不需要创建一个新的String对象,可以简单地返回现有的String对象。 参见concat文档以确认这点。
因此,如果你非常关心效率,那么你应该在连接可能为空的字符串时使用concat方法,否则就使用+。 然而,性能上的差异应该是可以忽略不计的,你可能永远都不应该担心这个问题。
我不认为如此。
a.concat(b)
是在String中实现的,我认为从早期的java机器开始,这个实现没有什么变化。+
操作的实现取决于Java版本和编译器。目前+
是用StringBuffer
实现的,以使操作尽可能快。也许在未来,这将会改变。在早期版本的java中,对字符串的+
操作要慢得多,因为它会产生中间结果。
我猜想+=
是用+
来实现的,也是类似的优化。