Created
November 23, 2012 02:26
-
-
Save royguo/4133760 to your computer and use it in GitHub Desktop.
Java String Deep Inside
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ldc 将int、float或String型常量值从常量池中推送至栈顶 | |
astore_index 将栈顶数值(objectref)存入当前frame的局部变量数组中指定下标index处的变量中,栈顶数值出栈 | |
getstatic 获取指定类的静态域,并将其值压入栈顶 | |
aload_index 当前frame的局部变量数组中下标为index的引用型局部变量进栈 | |
if_acmpne 比较栈顶两引用型数值,当结果不相等时跳转 | |
iconst_1 int型常量值1进栈 | |
new 创建一个对象,并且其引用进栈 | |
dup 复制栈顶数值,并且复制值进栈 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test{ | |
public static void main(String[] args) { | |
String a = "a1"; | |
String b = "a" + 1; | |
System.out.println(a == b); // True | |
} | |
} | |
/* | |
Compiled from "Test.java" | |
class Test extends java.lang.Object{ | |
Test(); | |
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; // 把常量池第二号位置的数据推送到当前线程的栈顶(即"a1") | |
2: astore_1 // 把当前栈顶的数据存储到局部变量数组的1号位置(即把"a1"赋值给a变量) | |
3: ldc #2; // 与第一步相同,取的是同一个数据 | |
5: astore_2 // 同上,把数据放到b变量中 | |
6: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; 调用print函数 | |
9: aload_1 //从局部变量数组1号位置取出数据放入栈顶 | |
10: aload_2 //同上,从2号位置取出数据放入栈顶 | |
11: if_acmpne 18 //如果栈顶两个数据引用不相等,跳转到18行,否则继续 | |
14: iconst_1 // 把常量1压入栈顶(表示true) | |
15: goto 19 // 跳转到第19行 | |
18: iconst_0 // 把常量0压入栈顶(表示false,本例没有跳转到此) | |
19: invokevirtual #4; //Method java/io/PrintStream.println:(Z)V 调用print函数 | |
22: return | |
} | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test{ | |
public static void main(String[] args) { | |
String a = "ab"; | |
String ab = "b"; | |
String b = "a" + ab; | |
System.out.println(a == b); //False | |
} | |
} | |
/* | |
Compiled from "Test.java" | |
class Test extends java.lang.Object{ | |
Test(); | |
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 ab | |
2: astore_1 | |
3: ldc #3; //String b | |
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 a | |
15: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
18: aload_2 | |
19: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
22: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; | |
25: astore_3 | |
26: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream; | |
29: aload_1 | |
30: aload_3 | |
31: if_acmpne 38 | |
34: iconst_1 | |
35: goto 39 | |
38: iconst_0 | |
39: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
42: return | |
} | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test{ | |
public static void main(String[] args) { | |
String a = "ab"; | |
final String bb = "b"; | |
String b = "a" + bb; | |
System.out.println(a == b); //True | |
} | |
} | |
/* | |
Compiled from "Test.java" | |
class Test extends java.lang.Object{ | |
Test(); | |
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 ab | |
2: astore_1 | |
3: ldc #2; //String ab | |
5: astore_3 | |
6: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; | |
9: aload_1 | |
10: aload_3 | |
11: if_acmpne 18 | |
14: iconst_1 | |
15: goto 19 | |
18: iconst_0 | |
19: invokevirtual #4; //Method java/io/PrintStream.println:(Z)V | |
22: return | |
} | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test{ | |
public static void main(String[] args) { | |
String a = "ab"; | |
final String bb = getBB(); | |
String b = "a" + bb; | |
System.out.println(a == b); //False | |
} | |
private static String getBB(){ | |
return "b"; | |
} | |
} | |
/* | |
Compiled from "Test.java" | |
class Test extends java.lang.Object{ | |
Test(); | |
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 ab | |
2: astore_1 | |
3: invokestatic #3; //Method getBB:()Ljava/lang/String; | |
6: astore_2 | |
7: new #4; //class java/lang/StringBuilder | |
10: dup | |
11: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V | |
14: ldc #6; //String a | |
16: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
19: aload_2 | |
20: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
23: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; | |
26: astore_3 | |
27: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream; | |
30: aload_1 | |
31: aload_3 | |
32: if_acmpne 39 | |
35: iconst_1 | |
36: goto 40 | |
39: iconst_0 | |
40: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
43: return | |
} | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test{ | |
private static String a ="ab"; | |
public static void main(String[] args) { | |
String s1 = "a"; | |
String s2 = "b"; | |
String s = s1 + s2; | |
System.out.println(s == a); | |
System.out.println(s.intern() == a); | |
} | |
} | |
/* | |
Compiled from "Test.java" | |
class Test extends java.lang.Object{ | |
Test(); | |
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 a | |
2: astore_1 | |
3: ldc #3; //String b | |
5: astore_2 | |
6: new #4; //class java/lang/StringBuilder | |
9: dup | |
10: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V | |
13: aload_1 | |
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
17: aload_2 | |
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; | |
24: astore_3 | |
25: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; | |
28: aload_3 | |
29: getstatic #9; //Field a:Ljava/lang/String; | |
32: if_acmpne 39 | |
35: iconst_1 | |
36: goto 40 | |
39: iconst_0 | |
40: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
43: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; | |
46: aload_3 | |
47: invokevirtual #11; //Method java/lang/String.intern:()Ljava/lang/String; | |
50: getstatic #9; //Field a:Ljava/lang/String; | |
53: if_acmpne 60 | |
56: iconst_1 | |
57: goto 61 | |
60: iconst_0 | |
61: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
64: return | |
static {}; | |
Code: | |
0: ldc #12; //String ab | |
2: putstatic #9; //Field a:Ljava/lang/String; | |
5: return | |
} | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Test{ | |
private static String a =new String("ab"); | |
public static void main(String[] args) { | |
String s1 = "a"; | |
String s2 = "b"; | |
String s = s1 + s2; | |
System.out.println(s == a); //False | |
System.out.println(s.intern() == a); //False | |
System.out.println(s.intern() == a.intern()); //True | |
} | |
} | |
/* | |
Compiled from "Test.java" | |
class Test extends java.lang.Object{ | |
Test(); | |
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 a | |
2: astore_1 | |
3: ldc #3; //String b | |
5: astore_2 | |
6: new #4; //class java/lang/StringBuilder | |
9: dup | |
10: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V | |
13: aload_1 | |
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
17: aload_2 | |
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; | |
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; | |
24: astore_3 | |
25: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; | |
28: aload_3 | |
29: getstatic #9; //Field a:Ljava/lang/String; | |
32: if_acmpne 39 | |
35: iconst_1 | |
36: goto 40 | |
39: iconst_0 | |
40: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
43: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; | |
46: aload_3 | |
47: invokevirtual #11; //Method java/lang/String.intern:()Ljava/lang/String; | |
50: getstatic #9; //Field a:Ljava/lang/String; | |
53: if_acmpne 60 | |
56: iconst_1 | |
57: goto 61 | |
60: iconst_0 | |
61: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
64: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; | |
67: aload_3 | |
68: invokevirtual #11; //Method java/lang/String.intern:()Ljava/lang/String; | |
71: getstatic #9; //Field a:Ljava/lang/String; | |
74: invokevirtual #11; //Method java/lang/String.intern:()Ljava/lang/String; | |
77: if_acmpne 84 | |
80: iconst_1 | |
81: goto 85 | |
84: iconst_0 | |
85: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V | |
88: return | |
static {}; | |
Code: | |
0: new #12; //class java/lang/String | |
3: dup | |
4: ldc #13; //String ab | |
6: invokespecial #14; //Method java/lang/String."<init>":(Ljava/lang/String;)V | |
9: putstatic #9; //Field a:Ljava/lang/String; | |
12: return | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment