1. 程式人生 > 其它 >[java基礎] java字串物件的"+"操作

[java基礎] java字串物件的"+"操作

java字串的"+"操作分為2種:

  1. 字面常量相加: String s1="a"+"b";

  String s2= "a";

  String s3="b";

2. String物件相加: String s4=s2+s3; 或 String s5=s2+"b";

先說結論:

  1.加號"+"兩邊任意一邊是String物件而非字面常量時,都會在堆區new一個新的String物件出來,並且會檢查常量池是否有對應值的物件,如果沒有會在常量池建立一個對應值的新物件;有則引用該常量池物件;

  2.如果"+"的兩邊都是字面常量,則會優先在字串常量池中尋找相同的值,如果有則引用該物件,否則建立新的String物件並放入常量;

 以下是推匯出結論的資料和例子:

 1  public static void main(String[] args) {
 2         String s1="ab";
 3         String s2="a"+"b";
 4         String s3="a";
 5         String s4="b";
 6         String s5=s3+s4;
 7         String s6="aba";
 8         String s7=s1+s3;
 9         // false
10         System.out.println(s5==s2);
11 // true 12 System.out.println(s1==s2); 13 // 推測1, 字面常量會被存入String的常量池,而字面常量通過"+"拼接時會被編譯器優化為另一個字面常量,如"a"+"b",優化後就是"ab", 14 //因s1已經先聲明瞭,所以String常量池已經有"ab"了,故s2引用的s1是同一個常量池中的物件,所以 s1==s2結果確實為true 15 16 // 推測2,s5=s3+s4,s3與s4是2個String型別的物件, String物件+String物件的結果等於new 新的String物件,無論該String物件的值是否儲存在string常量池中都會在堆中新增一個
17 // 預估 s6==s7為fasle,結果fasle ,符合推測1。推測1通過 18 System.out.println(s6==s7); 19 20 // 擴充套件1: String字面常量+String物件了? 21 String s8="abc"; 22 String s9=s1+"c"; 23 // 結果:false, 推測3,只要 + 的任意一邊是String物件,則都會new 新的String物件 24 System.out.println(s8==s9); 25 String s10="a"+s4; 26 // 結果:false, 推測3通過 27 System.out.println(s1==s10); 28 29 // 擴充套件2: 如果常量池中已經存2個相同值的物件(1個由2個字面常量相加而建立 ,另一個由String物件"+"操作建立)時,再一次由字面常量相加時是否會建立新的String物件,還是複用原有物件?
// (實際上,常量池中不會存在相同值的物件,通過 "javap -verbose java類名" 可以檢視驗證常量池的資料。 )
30 String s11="a"+"b"; 31 // 預估:true,結果:true, 32 System.out.println(s1==s11); 33 34 String s12=s3+"b"; 35 // 預估:false,結果:false 36 System.out.println(s1==s12); 37 43 44 }

以下是常量池的資料:

圖中紅線部分就是字串常量池中的資料;

參考:

  1. 如何檢視java常量池:https://blog.csdn.net/u010741466/article/details/84920253

2. java字串常量池:https://www.cnblogs.com/niew/p/9597379.html