首先,语义上略有不同。如果a是
null,则
a.concat(b)抛出一个
NullPointerException,但
a+=b将把原来的值a就好像它是null。此外,该
concat()方法仅接受
String值,而+操作员会将参数无提示地转换为
String(使用
toString()对象的方法)。因此,该
concat()方法在接受方面更加严格。
要深入了解,请写一个简单的类
a += b;
public class Concat { String cat(String a, String b) { a += b; return a; }}现在与一起拆卸
javap -c(包括在Sun JDK中)。你应该会看到一个列表,其中包括:
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,至少在性能方面,该方法是成功的。
Stringand的源代码
StringBuilder(及其包专用基类)在Sun JDK的
src.zip中可用。你会看到正在建立一个char数组(根据需要调整大小),然后在创建
final时将其丢弃
String。实际上,内存分配出奇的快。



