[java基礎] java字串物件的"+"操作
阿新 • • 發佈:2021-12-09
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