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

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

概括

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

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

  • 區(qū)別:

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

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

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

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

“==”是什么?

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

  2. 原理:
    “==”對(duì)比兩個(gè)對(duì)象基于內(nèi)存引用,如果兩個(gè)對(duì)象的引用完全相同(指向同一個(gè)對(duì)象)時(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));
             
             //對(duì)象
             AnotherClass ac1 = new AnotherClass();
             AnotherClass ac2 = new AnotherClass();
             AnotherClass ac3 = ac2;
             System.out.println("兩個(gè)new出來的對(duì)象比較結(jié)果:" + (ac1==ac2));
             System.out.println("賦值出來的對(duì)象比較結(jié)果:" + (ac3==ac2));
         }
     }
    

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

"equals()"是什么?

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

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

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

總結(jié):

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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