String “+”的疑惑

public static void main(String[] args) {
     String s="a";
     String s1="a"+"b";
     String s2="a"+"b";
     String s3=s+"b";
     String s4=s+"b";
     System.out.println(s1==s2);
     System.out.println(s1==s3);
     System.out.println(s3==s4);
}

输出结果是true、false、false,but why?
使用javap命令,得到jvm处理过程如下:

         0: ldc           #16                 // String a
         2: astore_1
         3: ldc           #18                 // String ab
         5: astore_2
         6: ldc           #18                 // String ab
         8: astore_3
         9: new           #20                 // class java/lang/StringBuilder
        12: dup
        13: aload_1
        14: invokestatic  #22                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
        17: invokespecial #28                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
        20: ldc           #31                 // String b
        22: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        25: invokevirtual #37                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        28: astore        4
        30: new           #20                 // class java/lang/StringBuilder
        33: dup
        34: aload_1
        35: invokestatic  #22                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
        38: invokespecial #28                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
        41: ldc           #31                 // String b
        43: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        46: invokevirtual #37                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        49: astore        5
        51: getstatic     #41                 // Field java/lang/System.out:Ljava/io/PrintStream;

原来对于 String s1=”a”+”b”;这种,jvm会直接处理为String s1=”a”+”b”,
String s3=s+”b”会处理为String s3=new StringBulider(s).append(“b”).toString();
总结:字符串”+”的处理方式是当出现变量的时候会使用StringBulider处理,没有变量的话就直接合并。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值