假设字符串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。实际上,内存分配出奇的快。
更新:正如Pawel Adamski
指出的那样,在最近的HotSpot
中,性能已经发生了变化。javac仍然产生完全相同的代码,但是字节码编译器作弊。简单的测试完全失败,因为整个代码主体都被丢弃了。总结System.identityHashCode
(不是String.hashCode
)表明StringBuffer
代码有一点优势。下一次更新发布时或使用其他JVM时,可能会发生更改。
问题内容: 对于字符串连接,我们可以使用or或concat运算符。 我尝试了以下性能测试,发现更快,更有效地进行字符串连接。 字符串连接比较100,000次 : 结果 如果比运算符快,那么什么时候应该使用串联运算符? 问题答案: concat方法始终会生成一个带有串联结果的新String。 plus运算符由StringBuilder创建来支持,它会附加所需的所有String值,并进一步对toStr
问题内容: 假设字符串a和b: 在幕后,他们是同一回事吗? 这里将concat反编译为参考。我也希望能够反编译该+运算符,以查看其作用。 问题答案: 首先,语义上略有不同。如果a是,则抛出一个,但将把原来的值a就好像它是null。此外,该方法仅接受值,而+操作员会将参数无提示地转换为(使用对象的方法)。因此,该方法在接受方面更加严格。 要深入了解,请写一个简单的类 ; 现在与一起拆卸(包括在Sun
本文向大家介绍通过+(字符串串联)运算符进行字符串串联。,包括了通过+(字符串串联)运算符进行字符串串联。的使用技巧和注意事项,需要的朋友参考一下 您可以使用Java的“ +”运算符来连接字符串。 示例 输出结果
问题内容: 我对String串联感到困惑。 输出为: 50abc20 50abc1010 我想知道为什么在两种情况下都将 20 + 30 加在一起,但是 10 + 10 需要加上括号(s1)而不是串联到String(s2)。请在此处说明String运算符的工作方式。 问题答案: 加法保持关联。以第一种情况 在第二种情况下:
问题内容: 我不知道MySQL的串联运算符。 我已尝试将此代码进行串联: 但这没有用。我应该使用哪个运算符来连接字符串? 问题答案: 您正在使用ORACLE类型的串联。MySQL的应该是 调用该函数,并用逗号分隔您的值。
问题内容: 嗨,我只是想知道为什么这段代码(至少对我来说)产生错误的结果。 好吧,我可能在这里错了 我猜想,如果paperType等于“ Bond”,则说明为“ Paper:Bond”,如果paperType不等于“ Bond”,则说明为“ Paper:Other”。 但是,当我运行这段代码时,结果描述是“ Bond”还是“ Other”,让我想知道字符串“ Paper:”去了哪里??? 问题答案