Skip to content

Instantly share code, notes, and snippets.

@royguo
Created November 23, 2012 02:26
Show Gist options
  • Save royguo/4133760 to your computer and use it in GitHub Desktop.
Save royguo/4133760 to your computer and use it in GitHub Desktop.
Java String Deep Inside
ldc 将int、float或String型常量值从常量池中推送至栈顶
astore_index 将栈顶数值(objectref)存入当前frame的局部变量数组中指定下标index处的变量中,栈顶数值出栈
getstatic 获取指定类的静态域,并将其值压入栈顶
aload_index 当前frame的局部变量数组中下标为index的引用型局部变量进栈
if_acmpne 比较栈顶两引用型数值,当结果不相等时跳转
iconst_1 int型常量值1进栈
new 创建一个对象,并且其引用进栈
dup 复制栈顶数值,并且复制值进栈
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
}
*/
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
}
*/
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
}
*/
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
}
*/
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
}
*/
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