假设字符串a和b:
a += b
a = a.concat(b)
concat() 和“+”运算符是一样的么?
在Java中,字符串连接:concat() 和“+”运算符的区别
concat() 和“+”运算符是不完全一样的。
首先,语义有细微差别。如果a是null,则a.concat(b)抛出一个NullPointerException,但a+=b将就是原来的a值。此外,该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."":()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方法至少会在性能方面获胜。