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

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

概括

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

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

  • 區(qū)別:

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

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

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

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

“==”是什么?

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

  2. 原理:
    “==”對比兩個對象基于內(nèi)存引用,如果兩個對象的引用完全相同(指向同一個對象)時,“==”操作將返回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));
             
             //字符串數(shù)據(jù)類型
             String str1 = new String("liaoshaoshao");
             String str2 = new String("liaoshaoshao");
             String str3 = str2;
             System.out.println("兩個new出來的字符串比較結(jié)果:" + (str1==str2));
             System.out.println("賦值出來的字符串比較結(jié)果:" + (str3==str2));
             
             //對象
             AnotherClass ac1 = new AnotherClass();
             AnotherClass ac2 = new AnotherClass();
             AnotherClass ac3 = ac2;
             System.out.println("兩個new出來的對象比較結(jié)果:" + (ac1==ac2));
             System.out.println("賦值出來的對象比較結(jié)果:" + (ac3==ac2));
         }
     }
    

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

"equals()"是什么?

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

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

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

    引申閱讀:
    官方API文檔中關(guān)于Object類的equals()的解釋:
    public boolean equals(Object obj)指示其他某個對象是否與此對象“相等”。
    equals 方法在非空對象引用上實現(xiàn)相等關(guān)系:
    - 自反性:對于任何非空引用值 x,x.equals(x) 都應(yīng)返回 true。
    - 對稱性:對于任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,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 方法實現(xiàn)對象上差別可能性最大的相等關(guān)系;即,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true(x == y 具有值 true)。
    - 注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對象必須具有相等的哈希碼。

  • 假設(shè)該類覆寫了equals(),那么就按照開發(fā)者自己想要的邏輯來判斷。最典型的例子當屬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;
    }
    個人見解:

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

總結(jié):

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容