Java 字串 + 操作原理
public class C {
String s1 = "a";
String s2 = "a"+"b";
public static void main(String args[]){
}
}
在編譯時其,如果+ 操作符兩邊都是常量,那麼在編譯後將其連線的值放入常量 池中,也就是將 ab 放入常量池,你不會找到常量 b
編譯後的指令為:
public C();
Code:
Stack=2, Locals=1, Args_size=1
0: aload_0 // 返回值this
1: invokespecial #11; //Method java/lang/Object."<init>":()V// 呼叫 this.<init>
4: aload_0// 返回this
5: ldc #13; //String a// 得到常量池中的 a
7: putfield #15; //Field s1:Ljava/lang/String; // 設定 欄位s1 的值
10: aload_0// 返回 this
11: ldc #17; //String ab// 返回常量中的 ab
13: putfield #19; //Field s2:Ljava/lang/String;// 設定 欄位 s2
16: return
上面是對於 + 運算元都為常量而言的,如果為變數,那麼怎麼樣?
如果為變數的話,它會 new StringBuilder 出來進行append,然後返回 toString()
public C();
Code:
Stack=4, Locals=1, Args_size=1
0: aload_0
1: invokespecial #11; //Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #13; //String a
7: putfield #15; //Field s1:Ljava/lang/String;
10: aload_0//以上都一樣,對 欄位 s1 進行賦值
11: new #17; //class java/lang/StringBuilder//建立一個 stringBuilder 物件
14: dup//複製棧項值並將複製值壓入棧頂
15: aload_0// 得到當前物件
16: getfield #15; //Field s1:Ljava/lang/String;// 得到欄位s1
19: invokestatic #19; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;//呼叫 String.valueOf
22: invokespecial #25; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V// 呼叫 StringBuilder 構造
25: ldc #28; //String b//從常量池中取出 b
27: invokevirtual #30; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;// 呼叫stringBuilder 中的 append 方法
30: invokevirtual #34; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;// 返回 stringBuilder 中的 toString()
33: putfield #38; //Field s2:Ljava/lang/String;// 設定欄位 s2
36: return
LineNumberTable: