String的不可變性並不是指它的值不可變,而是原來那塊所佔的內存不能修改
比如說:String s="123" s ="12345" 這時候s的值變了,並不是覆蓋了原有堆內存中,而是重新在堆中創建的新的內存區域並將s引用指向了新內存。
ps:StringBuffer和StringBuilde可以在原內存塊基礎上修改,不需要創建新的內存區域。StringBuffer線程安全效率不高,StringBuilder線程不安全效率高
2.創建String內存如何進行分配
2.1 String str="123" 會在常量池劃分內存區域 然後在堆內存劃分區域。若第二次又出現 String strs="123" .Jvm會去常量池中看是否存在相同內容的字符串。若存在引用指向strs.所以strs str引用地址一樣 str==strs 所以爲true
2.2 String str="123" String str2="12"+"3" 編譯器會自動合併str2 發現內容一樣 地址就一樣
2.3 String s1="123" String s2="1" String s3=s2+"23" 雖然s3和s1內容一樣 但是比較會拋出false,因爲編譯器在編譯期間無法確定s2的值,所以會分配新地址給s3, 所以比較地址時就不一樣