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”已经存在,于是就拿过来用了
添加回答
举报
0/150
提交
取消