我們來探討一下關於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
沒有留言:
張貼留言