String的不可變性質
一.String的宣告方式
第一種方法(推薦):
String s ="abcde";
在這個方法中,JVM會新增一個字串實例放到字串池(String Literal Pool)中,並讓s指向字串實例。
此方法的好處是可以共享已經被新增過的字串實例,避免不必要的物件被新增到heap中。
String Literal Pool : a collection of references to String objects
第二種方法:
String s=new String("abcde");
在這個方法中,JVM會新增一個字串實例到heap中,並讓s指向字串實例。
看完後會了然於心的程式碼:
(==)是用來判斷物件是否相同,所以如果要比較字串內容最好用equals()改寫之
//第一種方法
String a="abcde";
String b="abcde";
if(a==b)System.out.println("方法一: true");
else System.out.println("方法一: false");
//第二種方法
String c=new String("abcde");
String d=new String("abcde");
if(c==d)System.out.println("方法二: true");
else System.out.println("方法二: false");
console>>
方法一: true
方法二: false
二.String的不可變性質
Strings are Immutable
小範例:
String a="abc";
String b=a;
a=a+"de";
System.out.println("a = "+a);
System.out.println("b = "+b);
console>>
a = abcde
b = abc
為什麼b 不等於 abcde呢?
因為在第三行,JVM新增了"abcde"這個實例給a,所以b還是指向"abc"這個實例。
這也顯示字串的修改都是直接指派一個相等的實例,也印證了字串的不可變性質。
因為在第三行,JVM新增了"abcde"這個實例給a,所以b還是指向"abc"這個實例。
這也顯示字串的修改都是直接指派一個相等的實例,也印證了字串的不可變性質。
三.String 的 Garbage Collection
由字串池(String Literal Pool)所維護的字串並不會在沒有變數參照之後就被視為可以回收的對象。
所以在撰寫字串處理時,需要注意記憶體的耗用。
String a="not garbage";
String b = new String("garbage");
//"not garbage"不會被當垃圾,因為它的指標還是被字串池維護
a=null;
//"garbage" 被回收了
b=null;
四.利用StringBuilder來達成可變的字串
利用StringBuilder操作字串的串接,可以避免修改字串時不斷新增出字串實例。
StringBuilder a=new StringBuilder("abc");
StringBuilder b=a;
a.append("d");
System.out.println("a = "+a);
System.out.println("b = "+b);
console>>
a = abcd
b = abcd