JAVA字串的不可變性質

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"這個實例。
這也顯示字串的修改都是直接指派一個相等的實例,也印證了字串的不可變性質。

 

三.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