public class teststring
} 這個程式真是簡單啊!可是有什麼問題呢?
1. 來自 string 的憂慮
上面這段程式中,到底有幾個物件呢?
可能很多人脫口而出:兩個,s1 和 s2
為什麼?
string 是 final 類,它的值不可變。
看起來似乎很有道理,那麼來檢測一下吧,稍微改動一下程式
就可以看到結果了:
public class teststring
} 呵呵,很多人都會說已經不止兩個物件了
編譯並執行程式,輸出:s1 == s2
啊!為什麼 s1 == s2 ?
== 分明是在說:s1 與 s2 引用同乙個 string 物件 -- "monday"!
2. 千變萬化的 string
再稍微改動一下程式,會有更奇怪的發現:
public class teststring
} 我們將 s2 用 new 操作符建立
程式輸出:
s1 != s2
s1 equals s2
嗯,很明顯嘛
s1 s2分別引用了兩個"monday"string物件
可是為什麼兩段程式不一樣呢?
3. 在 string 的游泳池中游泳
哈哈,翻了翻書終於找到了答案:
原來,程式在執行的時候會建立乙個字串緩衝池
當使用 s2 = "monday" 這樣的表達是建立字串的時候,程式首先會
在這個string緩衝池中尋找相同值的物件,在第乙個程式中,s1先被
放到了池中,所以在s2被建立的時候,程式找到了具有相同值的 s1
將 s2 引用 s1 所引用的物件"monday"
第二段程式中,使用了 new 操作符,他明白的告訴程式:
「我要乙個新的!不要舊的!」與是乙個新的"monday"sting物件被創
建在記憶體中。他們的值相同,但是位置不同,乙個在池中游泳
乙個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什麼呢?
4. 繼續潛水
再次更改程式:
public class teststring
} 這次加入:s2 = s2.intern();
哇!程式輸出:
s1 == s2
s1 equals s2
原來,程式新建了 s2 之後,又用intern()把他打翻在了池裡
哈哈,這次 s2 和 s1 有引用了同樣的物件了
我們成功的減少了記憶體的占用
5. == 與 equals() 的爭鬥
string 是個物件,要對比兩個不同的string物件的值是否相同
明顯的要用到 equals() 這個方法
可是如果程式裡面有那麼多的string物件,有那麼多次的要用到 equals ,
哦,天哪,真慢啊
更好的辦法:
把所有的string都intern()到緩衝池去吧
最好在用到new的時候就進行這個操作
string s2 = new string("monday").intern();
嗯,大家都在水池裡泡著了嗎?哈哈
現在我可以無所顧忌的用 == 來比較 string 物件的值了
真是爽啊,又快又方便!
java中equals()與 區別
int a 10 int b 10 則a b將是true。但不好理解的地方是 string a new string foo string b new string foo 則a b將返回false。物件變數其實是乙個引用,它們的值是指向物件所在的記憶體位址,而不是物件本身。a和b都使用了new操作...
java中「 」 與 equals 區別
首先這是乙個很經典的例子,我們可以編寫乙個簡單的例子如下 有上述例子我們可以知道,是比較的我們資料位址,而equals則比較的是資料內容,a b,因為a,b為常量在常量池中為同意資料塊,所以相等,a1,b1是不同物件,在堆中儲存在不同區域,位址不同,所以a1 b1為false 那麼有些就奇怪了,為什...
Java中 與equals的區別
equals和 是兩個很容易混淆也是很多初學者容易搞不清的比較 方法 下面舉個例子,大家就一目了然了 比如 integer int1 new integer 1 integer int2 new integer 1 string str1 new string hello string str2 n...