探秘“==”與“equals()”的區(qū)別

本文采用總分總的小學(xué)生寫作手法較為深入地探究了“==”與“equals()”的區(qū)別 :-)

概括

  • 用途:equals()和“==”操作用于對象的比較,檢查倆對象的相等性。

  • 性質(zhì):前者是方法,后者是操作符。

  • 區(qū)別:

    1. ==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間
      equals()是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同

    2. ==是指對內(nèi)存地址進(jìn)行比較
      equals()是對字符串的內(nèi)容進(jìn)行比較

    3. ==指引用是否相同
      equals()指的是值是否相同

  • 通俗來說,如何記住區(qū)別?(不嚴(yán)謹(jǐn)?shù)恼f法)
    ==:等于。
    equals:相同。

“==”是什么?

  1. 是什么?
    “==”或等號操作在Java編程語言中是一個(gè)二元操作符,用于比較原生類型和對象。就原生類型如boolean、int、float來說,使用“==”來比較兩者,這個(gè)很好掌握,比如1=1。但是在比較對象的時(shí)候,就會與equals()造成困惑。

  2. 原理:
    “==”對比兩個(gè)對象基于內(nèi)存引用,如果兩個(gè)對象的引用完全相同(指向同一個(gè)對象)時(shí),“==”操作將返回true,否則返回false。

  3. 編程示例:
    class AnotherClass{

     }
     public class EqualsTest {
         public static void main(String[] args) {
             //基本數(shù)據(jù)類型:int、float、double、boolean、char等 
             char ch1 = 'a';
             char ch2 = 'a';
             System.out.println("char比較結(jié)果:" + (ch1==ch2));
             
             int i1 = 100;
             int i2 = 100;
             System.out.println("int比較結(jié)果:" + (i1==i2));
             
             //字符串?dāng)?shù)據(jù)類型
             String str1 = new String("liaoshaoshao");
             String str2 = new String("liaoshaoshao");
             String str3 = str2;
             System.out.println("兩個(gè)new出來的字符串比較結(jié)果:" + (str1==str2));
             System.out.println("賦值出來的字符串比較結(jié)果:" + (str3==str2));
             
             //對象
             AnotherClass ac1 = new AnotherClass();
             AnotherClass ac2 = new AnotherClass();
             AnotherClass ac3 = ac2;
             System.out.println("兩個(gè)new出來的對象比較結(jié)果:" + (ac1==ac2));
             System.out.println("賦值出來的對象比較結(jié)果:" + (ac3==ac2));
         }
     }
    

    控制臺輸出:
    char比較結(jié)果:true
    int比較結(jié)果:true
    兩個(gè)new出來的字符串比較結(jié)果:false
    賦值出來的字符串比較結(jié)果:true
    兩個(gè)new出來的對象比較結(jié)果:false
    賦值出來的對象比較結(jié)果:true

"equals()"是什么?

  • 是什么?
    equals()方法定義在Object類里面,根據(jù)具體的業(yè)務(wù)邏輯來定義該方法,用于檢查兩個(gè)對象的相等性。

  • 實(shí)際用途:
    Java 語言里的 equals方法其實(shí)是交給開發(fā)者去覆寫的,讓開發(fā)者自己去定義滿足什么條件的兩個(gè)Object是equal的。

  • 在默認(rèn)情況下(即該類默認(rèn)繼承Object類),equals()和==是一樣的,除非被覆寫(override)了。
    因?yàn)樵贠bject類中有equals(),其代碼如下:
    public boolean equals(Object obj) {
    return (this == obj);
    }
    可以看出,如果不覆寫,那么equals()與==沒什么區(qū)別。

    引申閱讀:
    官方API文檔中關(guān)于Object類的equals()的解釋:
    public boolean equals(Object obj)指示其他某個(gè)對象是否與此對象“相等”。
    equals 方法在非空對象引用上實(shí)現(xiàn)相等關(guān)系:
    - 自反性:對于任何非空引用值 x,x.equals(x) 都應(yīng)返回 true。
    - 對稱性:對于任何非空引用值 x 和 y,當(dāng)且僅當(dāng) y.equals(x) 返回 true 時(shí),x.equals(y) 才應(yīng)返回 true。
    - 傳遞性:對于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 應(yīng)返回 true。
    - 一致性:對于任何非空引用值 x 和 y,多次調(diào)用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。
    - 對于任何非空引用值 x,x.equals(null) 都應(yīng)返回 false。
    Object 類的 equals 方法實(shí)現(xiàn)對象上差別可能性最大的相等關(guān)系;即,對于任何非空引用值 x 和 y,當(dāng)且僅當(dāng) x 和 y 引用同一個(gè)對象時(shí),此方法才返回 true(x == y 具有值 true)。
    - 注意:當(dāng)此方法被重寫時(shí),通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對象必須具有相等的哈希碼。

  • 假設(shè)該類覆寫了equals(),那么就按照開發(fā)者自己想要的邏輯來判斷。最典型的例子當(dāng)屬String類,String類中已經(jīng)覆寫了equals(),源碼如下:
    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String) anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }
    個(gè)人見解:

    • String類的equals()方法調(diào)用后,首先會比較這兩個(gè)String類的對象(即兩個(gè)字符串)的地址是否相等,若相等,那當(dāng)然“equals”,返回true。
    • anObject即為傳入的參數(shù),首先得確定它是String類的對象,所以用instanceof來判斷,如果連String類型都不是,那只執(zhí)行最后的return false。滿足條件后,強(qiáng)制轉(zhuǎn)換為String類型。
    • value.length是自對象的字符串長度。
    • 兩個(gè)字符串長度相等,才能繼續(xù)比較,長度不等,則返回false。
    • 接下來就是依次比較兩個(gè)字符串中字符是否相等,若出現(xiàn)了不相等的字符,直接返回false,如果一直到比較完了都沒有出現(xiàn)不相等的字符,則返回true
    • 結(jié)論:String類中的equals方法用來比較兩個(gè)字符串內(nèi)容是否相等。(當(dāng)然,地址相等,那么內(nèi)容肯定也是相等的)

總結(jié):

  • 對于值變量(int、float、double、char等),用“==”來判斷相等性。

  • 對于String,用“==”來判斷字符串地址是否相等,用“equals()”來判斷字符串內(nèi)容是否相等。

  • 對于引用對象,用“==”來判斷對象地址是否相等,經(jīng)常覆寫equals方法,讓開發(fā)者自己去定義滿足什么條件的兩個(gè)Object是equal的。

引申閱讀:
https://www.zhihu.com/question/26872848

學(xué)生一枚,難免有錯(cuò)誤之處,請各位大神斧正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,707評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • #田生萬物彤彤媽咪吃貨日記#第12天 又到了吃柚子的季節(jié)了,說起柚子大家都不陌生,相信大家也都經(jīng)常吃柚子,你們...
    淇彤媽咪閱讀 548評論 0 0
  • 從“擺平違規(guī)者”一節(jié)可以看出,潛規(guī)則在明代官吏體制中是廣泛存在,并且得到大家一致認(rèn)可的事情。這種規(guī)則與其說是潛規(guī)則...
    帥哥哥美女閱讀 798評論 0 0
  • 心中有夢,路不孤單,生的再平凡,也要限量版。這里是317280,一仁說,我是主播一仁君,讓我把時(shí)間推回2010年6...
    大鬧天宮的潑猴閱讀 140評論 0 0