我是java的初学者。我对String上的+=
操作有疑问。为什么我可以使用+=
运算符来追加没有双引号的String对象?
例如,我在这段代码上没有编译错误
String s1 = "abc";
String s1+=42;
当我真的以为我必须使用s1+="42"
;
答案 0 :(得分:2)
String s1+=def;
该行有效,然后def
是另一个Java String。由于它是成功编译的,所以在代码之前的某些地方,你有
String def ="someDeclaredStringBefore";
**Update:**
为了清楚发生什么事情,首先让我们看看+
如何在字符串上运行。
它使用StringBuilder追加方法。对于前
StringBuilder compilerGeneratedBuilder = new StringBuilder();
compilerGeneratedBuilder.append("str");
compilerGeneratedBuilder.append("ingcon");
compilerGeneratedBuilder.append("catenation");
String finalString = compilerGeneratedBuilder.toString();
我最近在这里写的全文:
http://codeinventions.blogspot.com/2014/08/compiler-version-string-concatenation.html
撰写String r += 42;
因为您尝试添加int
值。 StringBuilder上的相应append(int i)
方法调用和最终字符串生成。
答案 1 :(得分:2)
使用此代码模拟您的上述问题:
String s = "asd";
s+=42;
System.out.println(s);
将导致此byteCote:
Code:
0: ldc #16 // String asd
2: astore_1
3: new #18 // class java/lang/StringBuilder
6: dup
7: aload_1
8: invokestatic #20 // Method java/lang/String.valueOf:(
java/lang/Object;)Ljava/lang/String;
11: invokespecial #26 // Method java/lang/StringBuilder."<
nit>":(Ljava/lang/String;)V
14: bipush 42
16: invokevirtual #29 // Method java/lang/StringBuilder.ap
end:(I)Ljava/lang/StringBuilder;
19: invokevirtual #33 // Method java/lang/StringBuilder.to
tring:()Ljava/lang/String;
22: astore_1
23: getstatic #37 // Field java/lang/System.out:Ljava/
o/PrintStream;
26: aload_1
27: invokevirtual #43 // Method java/io/PrintStream.printl
:(Ljava/lang/String;)V
30: return
查看数字16和19 ,您可以清楚地看到它调用StringBuilder类并在append method
内部调用附加42 += operator
的{{1}}然后它将它转换为String。
编辑:
上面的代码实际上是这样说的:line 19
,所以每次使用plus运算符到String的整数时,它都会调用它的包装类并调用toString方法
s = s + 42
答案 2 :(得分:1)
String s1 = "abc";
String s1+=42;
这很有效,因为42是int
。
加号+
是Java中的重载运算符。它可以添加数字或附加字符串。
如果您对这两个号码都使用+
,则会添加它。
System.out.println(1+1); //2
如果您在两个字符串上使用它,它将附加字符串。
System.out.println("abc"+"def"); //abcdef
如果您在数字和字符串的组合中使用它,它只会将它附加在一起。
System.out.println(1+"1"); //11