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:	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,结果就很明显了;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值