java String的equals,intern方法(轉載)

來源:互聯網
上載者:User

標籤:

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 對象的值了

真是爽啊,又快又方便!

java String的equals,intern方法(轉載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.