不,不完全是。
首先,语义略有不同。如果 是 ,则抛出一个,但会将的原始值视为 .此外,该方法仅接受值,而运算符将以静默方式将参数转换为 String(对对象使用该方法)。因此,该方法在接受的内容上更加严格。a
null
a.concat(b)
NullPointerException
a+=b
a
null
concat()
String
+
toString()
concat()
要查看引擎盖下,请编写一个简单的类a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
现在拆卸(包含在Sun JDK中)。您应该会看到一个列表,其中包括:javap -c
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
所以,等价物是a += b
a = new StringBuilder()
.append(a)
.append(b)
.toString();
该方法应该更快。但是,随着字符串的增加,该方法至少在性能方面是获胜的。concat
StringBuilder
和(及其包私有基类)的源代码在 Sun JDK 的 src.zip中可用。您可以看到您正在构建一个 char 数组(根据需要调整大小),然后在创建最终的 .在实践中,内存分配的速度惊人。String
StringBuilder
String
更新:正如Pawel Adamski所指出的那样,在最近的HotSpot中,性能发生了变化。 仍然生成完全相同的代码,但字节码编译器作弊。简单的测试完全失败,因为整个代码主体都被丢弃了。求和(不是)表明代码有轻微的优势。在下一个更新发布时,或者如果您使用不同的 JVM,则可能会发生变化。从@lukaseder,HotSpot JVM内部函数的列表。javac
System.identityHashCode
String.hashCode
StringBuffer