Related learning recommendations: java basic tutorial
There is a simple code below
public class StringPlusTest{ public static void main(String[] args) { String s1 = "aaa"; String s2 = "bbb"; String s = "ccc" +s1 + s2 +"ddd"; }}
Use javap -c .\StringPlusTest.class
to decompile and get
Compiled from "StringPlusTest.java"public class com.epoint.codetuning.test.StringPlusTest { public com.epoint.codetuning.test.StringPlusTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String aaa 2: astore_1 3: ldc #3 // String bbb 5: astore_2 6: new #4 // class java/lang/StringBuilder 9: dup 10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V 13: ldc #6 // String ccc 15: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 18: aload_1 19: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 22: aload_2 23: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 26: ldc #8 // String ddd 28: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 31: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 34: astore_3 35: return}
Among them,
ldc 把常量池中的项压入栈 astore_1 将引用类型或returnAddress类型值存入局部变量1 astore_2 将引用类型或returnAddress类型值存入局部变量2 new 创建一个新对象 dup 复制栈顶部一个字长内容 invokespecial 根据编译时类型来调用实例方法 aload_1 从局部变量1中装载引用类型值 aload_2 从局部变量2中装载引用类型值 astore_3 将引用类型或returnAddress类型值存入局部变量3
For more instructions, please see the JVM instruction manual
For For Java, this code should be in principle:
public class StringPlusTest{ public static void main(String[] args) { String s1 = "aaa"; String s2 = "bbb"; String s = new StringBuilder().append("ccc").append(s1).append(s2).append("ddd").toString(); }}
It can be seen that the implementation principle of using " " to splice strings in Java is to create a temporary StringBuilder object and call the append and toString methods.
Made some modifications to the above code
public class StringPlusTest{ public static void main(String[] args) { String s1 = "aaa"; String s2 = null; String s = "ccc" +s1 + s2 +"ddd"; System.out.println(s); }}
What is the result?
You can get the following when running:
cccaaanullddd
View the StringBuilder source code
@Overridepublic StringBuilder append(String str) { super.append(str); return this;}
This method calls the method that inherits the parent class AbstractStringBuilder, and then goes to the parent class to view
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this;}private AbstractStringBuilder appendNull() { int c = count; ensureCapacityInternal(c + 4); final char[] value = this.value; value[c++] = 'n'; value[c++] = 'u'; value[c++] = 'l'; value[c++] = 'l'; count = c; return this;}## The #appendNull method simply has a capacity of 4 and appends a null string. So the result is "cccaaanullddd".
If you want to know more about programming learning, please pay attention to thephp training column!
The above is the detailed content of In java do you know what String does to '+'. For more information, please follow other related articles on the PHP Chinese website!