java String的equals,intern方法
java String的equals,intern方法
JAVA中的equals和==的區別
==比較的是2個物件的地址,而equals比較的是2個物件的內容。
顯然,當equals為true時,==不一定為true;
基礎知識的重要性,希望引起大家的重視,包括自己在內
很多困惑和疑問而且均來自於最基礎的知識
折騰了一陣子又查了查書,終於對 String 這個特殊的物件有了點感悟
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
}
}
有什麼問題呢?
1. 來自 String 的憂慮
上面這段程式中,到底有幾個物件呢?
可能很多人脫口而出:兩個,s1 和 s2
為什麼?
String 是 final 類,它的值不可變。
看起來似乎很有道理,那麼來檢測一下吧,稍微改動一下程式
就可以看到結果了:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
呵呵,很多人都會說已經不止兩個物件了
編譯並執行程式,輸出:s1 == s2
啊!
為什麼 s1 == s2 ?
== 分明是在說:s1 與 s2 引用同一個 String 物件 -- "Monday"!
2. 千變萬化的 String
再稍微改動一下程式,會有更奇怪的發現:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
我們將 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 {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
s2 = s2.intern();
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
這次加入: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 物件的值了
真是爽啊,又快又方便!
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/ameyume/archive/2010/08/16/5815756.aspx
相關文章
- Java -- String的intern方法Java
- 聊聊java String的internJava
- Java String.intern()Java
- String的intern方法使用場景
- String的equals和hashCode方法
- String類中的equals方法與Object類中的equals方法的不同點Object
- java基礎:String — 字串常量池與intern(二)Java字串
- Object類和String類equals方法的區別Object
- Java之String的equals與contentEquals區別Java
- 深入理解 Java String#intern() 記憶體模型Java記憶體模型
- String物件的equals()與 = =物件
- 關於Java中的equals方法Java
- java equals()方法的注意事項Java
- java基礎:Object的equals方法JavaObject
- 通過反編譯深入理解Java String及intern編譯Java
- Java技術——你真的瞭解String類的intern()方法嗎(jdk1.6和1.7之後不一樣!!)(String類的intern看這一篇就足夠了)JavaJDK
- Java中 equals() 方法和 == 的區別Java
- 幾張圖輕鬆理解String.intern()
- 簡單介紹java中的equals()方法Java
- 搞懂 Java equals 和 hashCode 方法Java
- 深入談談String.intern()在JVM的實現JVM
- Java基礎-- ==號與equals()方法的區別Java
- Java基礎系列-equals方法和hashCode方法Java
- java equalsJava
- java - equals()Java
- Java String類的replaceAll方法Java
- 使用String.intern減少記憶體使用記憶體
- Java中String類的常用方法Java
- Java 中 String 的構造方法Java構造方法
- Java 中 String 的常用方法(一)Java
- Java 中 String 的常用方法(二)Java
- java == 和equalsJava
- java String 常用方法集合Java
- java中equals方法與==邏輯運算子薦Java
- ==和equals方法的區別
- Java-String的常用方法總結!Java
- 【Java】equals 和 == 的區別Java
- java基本型別和包裝型別的“==”和equals()方法Java型別