首頁 Java java教程 [JAVA] String.equals和==的不同效果

[JAVA] String.equals和==的不同效果

Dec 16, 2016 am 09:50 AM
equals

1 一個最簡單的程式:

public class A {    public static void main(String args[]) {
        String s1 = "Hello";
        String s2 = "Hello";
        System.out.println(s1 == s2);
    }
}
登入後複製

一定很多人說,輸出true,確實是輸出true,s1和s2引用的是同一個東西嘛。但是這個程式如果換一種寫法,那肯定就不太一樣了。

2 第一種變體:

public class A {    public static void main(String args[]) {
        String s1 = "Hello";
        String s2 = new String("Hello");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}
登入後複製

或:

public class A {    public static void main(String args[]) {
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}
登入後複製

那麼結果就有點不太確定了,有些人很壞的想到了,單獨拿出來,肯定至少有一個不會相等。

這兩個程式的結果都是false true,原因很簡單,JAVA是一個基本上完全物件導向的語言,s1 == s2 判斷的是他的引用(相當於記憶體位址、指標),equals則是使用這個物件本身的方法去判斷值是否相等。

在以下表達式中:

String s1 = "Hello";
String s2 = new String("Hello");
登入後複製

JVM得到的是兩個不同的資訊:
1.我要建立一個「Hello」字串。
2.我要建立一個新的「Hello」字串,不要跟原來的一樣的。
於是,s1 != s2.

3 第二種變體:

顺序排列:
public class A {
    public static void main(String args[]) {
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        String s3 = "Hello";
        s1=s1.intern();
        s2=s2.intern();
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s3 == s2);
        System.out.println(s3.equals(s2));
    }
}
登入後複製
打乱顺序排列:
public class A {
    public static void main(String args[]) {
        String s1 = new String("Hello");
        String s3 = "Hello";
        s1=s1.intern();
        String s2 = new String("Hello");
        s2=s2.intern();
        //也可以String s2 = new String("Hello").intern();
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s3 == s2);
        System.out.println(s3.equals(s2));
    }
}
登入後複製

那麼這次應該很清楚了=
兩個object,但是中間加入了一些羞恥的東西,於是答案肯定是true true true true。
那麼intern到底是什麼。

4 intern作用:

當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(該物件由 equals(Object) 方法決定),則傳回池中的字串。 否則,將此 String 物件新增至池中,並且傳回此 String 物件的參考。

intern的適用情況:多個相同的大字串同時出現的情況,例如可能出現多個相同訊息的訊息佇列的設計。




更多[JAVA] String.equals和==的不同效果相關文章請關注PHP中文網!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte 2025年的前4個JavaScript框架:React,Angular,Vue,Svelte Mar 07, 2025 pm 06:09 PM

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Mar 17, 2025 pm 05:35 PM

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? 如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? Mar 17, 2025 pm 05:46 PM

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?

Node.js 20:關鍵性能提升和新功能 Node.js 20:關鍵性能提升和新功能 Mar 07, 2025 pm 06:12 PM

Node.js 20:關鍵性能提升和新功能

冰山:數據湖桌的未來 冰山:數據湖桌的未來 Mar 07, 2025 pm 06:31 PM

冰山:數據湖桌的未來

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Mar 07, 2025 pm 05:52 PM

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復

如何在Java中實施功能編程技術? 如何在Java中實施功能編程技術? Mar 11, 2025 pm 05:51 PM

如何在Java中實施功能編程技術?

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? 如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? Mar 17, 2025 pm 05:43 PM

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?

See all articles