今天关于String看到一个测试:
String a = "abc";
String b = "abc";
String ab = "ab";
String c = ab+"c";
String d = "ab"+"c";
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
结果当然是true,false,true;
用javap反编译来解释一下:
Code:
0: ldc #2; //String abc
2: astore_1
3: ldc #2; //String abc
5: astore_2
6: ldc #3; //String ab
8: astore_3
9: new #4; //class java/lang/StringBuilder
12: dup
13: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V
16: aload_3
17: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: ldc #7; //String c
22: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
28: astore 4
30: ldc #2; //String abc
32: astore 5
34: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream;
37: aload_1
38: aload_2
39: if_acmpne 46
42: iconst_1
43: goto 47
46: iconst_0
47: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V
50: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream;
53: aload_1
54: aload 4
56: if_acmpne 63
59: iconst_1
60: goto 64
63: iconst_0
64: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V
67: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream;
70: aload_1
71: aload 5
73: if_acmpne 80
76: iconst_1
77: goto 81
80: iconst_0
81: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V
84: return
第一个println是比较astore_1和astore_2,而它们指向的常量池中#2号字符串常量“abc”,所以,a==b;
第二个println是比较astore_1和astore 4,分别指向#2和#7,所以a!=c;
第三个println是比较astore_1和astore 5,都是#2,结果就很明显了;