Java字符串串联:concat()与“ +”operator

假设字符串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);

}

}

回答:

首先,语义上略有不同。如果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。实际上,内存分配出奇的快。

以上是 Java字符串串联:concat()与“ +”operator 的全部内容, 来源链接: utcz.com/qa/405930.html

回到顶部