JAVA: String 和 final String
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 -> falses8==s1 -> true字节码:0: ldc #16 // String a 2: astore_13: ldc #18 // String b 5: astore_26: ldc #20 // String ab 8: astore_3// s6的过程,这个我知道17: new #22 // class java/lang/StringBuilder20: dup21: aload_122: invokestatic #24 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;25: invokespecial #30 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V28: aload_229: 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 //s850: astore 852: ldc #18 // String b //s954: astore 956: ldc #20 // String ab /s1058: astore 10 |
免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。
版权声明:作者保留权利,不代表天盟立场。
|
|
|
|
可能是 javac 比较智能吧,看到相加的两个变量都是 用 final 修饰的,所以认为结果也应该是常量,然后就在编译过程中算好了,正好又发现 “ab”已经存在,于是就拿过来用了 |
|
|
|
|