1. 程式人生 > >Java 字串 + 操作原理

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: