为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA: String 和 final String

JAVA: String 和 final String

隔壁老伍丶 2016-12-17 21:26:04
String s1 = "a";   String s2 = "b";    String s3 = "ab"; String s6 = s1+s2;   System.out.println("s3==s6 -> "+ (s3==s6)); final String s8 = "a" ;    final String s9 = "b" ;   String s10 = s8 + s9;  System.out.println("s3==s10 -> "+ (s3==s10));  output: s3==s6 -> false s8==s1 -> true 字节码: 0: ldc           #16                 // String a    2: astore_1 3: ldc           #18                 // String b    5: astore_2 6: ldc           #20                 // String ab   8: astore_3 // s6的过程,这个我知道 17: new           #22                 // class java/lang/StringBuilder 20: dup 21: aload_1 22: invokestatic  #24                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; 25: invokespecial #30                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 28: aload_2 29: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 32: invokevirtual #37                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 35: astore  // 下面是问题 // 同样是相加,为什么s10不走s6的过程? 而是直接取#20。 48: ldc           #16                 // String a     //s8 50: astore        8 52: ldc           #18                 // String b    //s9 54: astore        9 56: ldc           #20                 // String ab    /s10 58: astore        10
查看完整描述

1 回答

?
wldraa

TA贡献33条经验 获得超17个赞

可能是 javac 比较智能吧,看到相加的两个变量都是 用 final 修饰的,所以认为结果也应该是常量,然后就在编译过程中算好了,正好又发现 “ab”已经存在,于是就拿过来用了

查看完整回答
反对 回复 2016-12-21
  • 1 回答
  • 0 关注
  • 1629 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信