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 -> 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


隔壁老伍丶
浏览 1632回答 1
1回答

wldraa

可能是 javac 比较智能吧,看到相加的两个变量都是 用 final 修饰的,所以认为结果也应该是常量,然后就在编译过程中算好了,正好又发现 “ab”已经存在,于是就拿过来用了
打开App,查看更多内容
随时随地看视频慕课网APP