jiji879 发表于 2013-1-19 04:06:57

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,结果就很明显了;
页: [1]
查看完整版本: String..