源代码:
public class Demo {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
String s3 = "abc" + s1 + "def";
String s4 = "abcabcdef";
System.out.println(s3 == s4);
String s5 = s3.intern();
System.out.println(s4 == s5);
}
}
代码分析:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=6, args_size=1
0: ldc #2 // String abc 加载常量abc
2: astore_1 // 将abc放到局部变量表1中
3: ldc #2 // String abc 加载常量abc
5: astore_2 // 将abc放到局部变量表2中
6: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_1 // 从局部变量1中装载引用类型值
10: aload_2 // 从局部变量2中装载引用类型值
11: if_acmpne 18 // 比较局部变量1和局部变量2相等
14: iconst_1 //
15: goto 19
18: iconst_0
19: invokevirtual #4 // Method java/io/PrintStream.println:(Z)V
22: new #5 // class java/lang/StringBuilder
25: dup
26: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
29: ldc #2 // String abc
31: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
34: aload_1
35: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
38: ldc #8 // String def
40: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
43: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
46: astore_3
47: ldc #10 // String abcabcdef
49: astore 4
51: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
54: aload_3
55: aload 4
57: if_acmpne 64
60: iconst_1
61: goto 65
64: iconst_0
65: invokevirtual #4 // Method java/io/PrintStream.println:(Z)V
68: aload_3
69: invokevirtual #11 // Method java/lang/String.intern:()Ljava/lang/String;
72: astore 5
74: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
77: aload 4
79: aload 5
81: if_acmpne 88
84: iconst_1
85: goto 89
88: iconst_0
89: invokevirtual #4 // Method java/io/PrintStream.println:(Z)V
92: return
LineNumberTable:
line 10: 0
line 11: 3
line 12: 6
line 14: 22
line 15: 47
line 16: 51
line 18: 68
line 19: 74
line 20: 92
LocalVariableTable:
Start Length Slot Name Signature
0 93 0 args [Ljava/lang/String;
3 90 1 s1 Ljava/lang/String;
6 87 2 s2 Ljava/lang/String;
47 46 3 s3 Ljava/lang/String;
51 42 4 s4 Ljava/lang/String;
74 19 5 s5 Ljava/lang/String;