String..
今天关于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:astore4 30:ldc#2; //String abc 32:astore5 34:getstatic#9; //Field java/lang/System.out:Ljava/io/PrintStream; 37:aload_1 38:aload_2 39:if_acmpne46 42:iconst_1 43:goto47 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:aload4 56:if_acmpne63 59:iconst_1 60:goto64 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:aload5 73:if_acmpne80 76:iconst_1 77:goto81 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,结果就很明显了;