2015年5月10日 星期日

【JAVA】String的內容值不可變

我們來探討一下關於String的內容指與比較



String s = "DOG";
s ="CAT";

在我們看來值好像改變了,但其實他並不是改變值,

因為String是一個參考類別,賦予他值後,他是將 s 指向 "DOG"這個這個實體,

當你又賦予了一個新的值"CAT", s 是直接重新指向"CAT"的實體,並非將DOG實體改為CAT


改變的是位址並不是實體!!!!



這就是所謂 String的內容值不可變 的意思。


延伸思考一:



既然String s 是指向位置

那麼當

String str1 = new String("Dog");
String str2 = new String("Dog");

System.out.println(str1 == str2);

會回傳甚麼?

答案是:false
因為他們指向的是不同的位置,用 == 是在比較str他們的值,而他們的值都是位置並非字串,所以當你使用 == 來做比較字串會發生錯誤!!!!

要利用equals()這個方法才能比較字串。



延伸思考二:

那麼當


String str1 = "Dog";
String str2 = "Dog";

System.out.println(str1 == str2);

會回傳甚麼?

答案是:true


因為我們是直接指向相同的字串,而在Java中有一個
StringPool他會先去找是否有相同的字串,有的話直接指向,不在重新創造實體出來。

如果你想先檢查是否在
StringPool有相同字串,你可以利用intern()這個方法。


範例:(取自良葛格blog)

public class StringIntern { 
    public static void main(String[] args) { 
        String str1 = "fly"; 
        String str2 = "weight"; 
        String str3 = "flyweight"; 
        String str4; 

        str4 = str1 + str2; 
        System.out.println(str3 == str4); 
        //false
        str4 = (str1 + str2).intern(); 
        System.out.println(str3 == str4); 
       //true
    } 
} 


參考連結:http://openhome.cc/Gossip/JavaGossip-V1/ImmutableString.htm

沒有留言:

張貼留言