最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java必學必會之equals方法

 更新時間:2015年12月04日 09:57:17   作者:孤傲蒼狼  
java必學必會之equals方法,equals方法是 java.lang.Object 類的方法,想要了解更多關(guān)于equals方法的朋友,可以參考下文

一、equals方法介紹

1.1.通過下面的例子掌握equals的用法


package cn.galc.test;
public class TestEquals {
  public static void main(String[] args) {
    /**
     * 這里使用構(gòu)造方法Cat()在堆內(nèi)存里面new出了兩只貓,
     * 這兩只貓的color,weight,height都是一樣的,
     * 但c1和c2卻永遠不會相等,這是因為c1和c2分別為堆內(nèi)存里面兩只貓的引用對象,
     * 里面裝著可以找到這兩只貓的地址,但由于兩只貓在堆內(nèi)存里面存儲在兩個不同的空間里面,
     * 所以c1和c2分別裝著不同的地址,因此c1和c2永遠不會相等。
     */
    Cat c1 = new Cat(1, 1, 1);
    Cat c2 = new Cat(1, 1, 1);
    System.out.println("c1==c2的結(jié)果是:"+(c1==c2));//false
    System.out.println("c1.equals(c2)的結(jié)果是:"+c1.equals(c2));//false
  }
}

class Cat {
  int color, weight, height;

  public Cat(int color, int weight, int height) {
    this.color = color;
    this.weight = weight;
    this.height = height;
  }
}

1.2.畫出內(nèi)存分析圖分析c1和c2比較的結(jié)果

程序:

Cat c1 = new Cat(1,1,1);

Cat c2 = new Cat(1,1,1);

執(zhí)行完之后內(nèi)存之中的布局如下圖所示,

  c1指向一個對象,c2也指向一個對象,c1和c2里面裝著的是這兩只Cat對象在堆內(nèi)存里面存儲的地址,由于這兩只Cat對象分別位于不同的存儲空間,因此c1和c2里面裝著的地址肯定不相等,因此c1和c2這兩個引用對象也肯定不相等。因此執(zhí)行:“System.out.println(c1==c2);”打印出來的結(jié)果肯定是false。因此你new出來了兩個對象,你放心,這兩個對象的引用永遠不一樣,一樣的話就會把其中一個給覆蓋掉了,這個可不成。c1是不是等于c2比較的是c1和c2這兩個引用里面裝著的內(nèi)容,因為new出來的兩個對象的它們的引用永遠不一樣,因此c1和c2這兩個引用的內(nèi)容也永遠不一樣,因此c1永遠不可能等于c2。因此通過比較兩個對象的引用是永遠無法使得兩個對象相等的,一模一樣的。

  要想判斷兩個對象是否相等,不能通過比較兩個對象的引用是否相等,這是永遠都得不到相等的結(jié)果的,因為兩個對象的引用永遠不會相等,所以正確的比較方法是直接比較這兩個對象,比較這兩個對象的實質(zhì)是不是一樣的,即這兩個對象里面的內(nèi)容是不是相同的,通過比較這兩個對象的屬性值是否相同而決定這兩個對象是否相等。

  Object類提供了一個equals()方法來比較兩個對象的內(nèi)容是否相同,因此我們可以采用這個方法去比較兩個對象是否在邏輯上“相等”。如:c1.equals(c2);這里是調(diào)用從Object類繼承下來的equals()方法,通過查閱API文檔得到Object類里的equals方法的定義如下:

public boolean equals(Object obj)

  在Object這個類里面提供的Equals()方法默認的實現(xiàn)是比較當前對象的引用和你要比較的那個引用它們指向的是否是同一個對象,即和“c1==c2”這種寫法是一樣的,“c1.equals(c2)”與“c1==c2”是完全等價的。因此直接使用繼承下來的equals()方法也是無法直接比較兩個對象的內(nèi)容是否相同的,為此,我們必須得重寫equals()方法,改變這個方法默認的實現(xiàn)。

下面在Cat類里面重寫這個繼承下來的equals()方法:

class Cat {
  int color, weight, height;

  public Cat(int color, int weight, int height) {
    this.color = color;
    this.weight = weight;
    this.height = height;
  }
  
  /**
   * 這里是重寫相等從Object類繼承下來的equals()方法,改變這個方法默認的實現(xiàn),
   * 通過我們自己定義的實現(xiàn)來判斷決定兩個對象在邏輯上是否相等。
   * 這里我們定義如果兩只貓的color,weight,height都相同,
   * 那么我們就認為這兩只貓在邏輯上是一模一樣的,即這兩只貓是“相等”的。
   */
  public boolean equals(Object obj){
    if (obj==null){
      return false;
    }
    else{
      /**
       * instanceof是對象運算符。
       * 對象運算符用來測定一個對象是否屬于某個指定類或指定的子類的實例。
       * 對象運算符是一個組合單詞instanceof。
       * 該運算符是一個雙目運算符,其左邊的表達式是一個對象,右邊的表達式是一個類,
       * 如果左邊的對象是右邊的類創(chuàng)建的對象,則運算結(jié)果為true,否則為false。
       */
      if (obj instanceof Cat){
        Cat c = (Cat)obj;
        if (c.color==this.color && c.weight==this.weight && c.height==this.height){
          return true;
        }
      }
    }
    return false;
  }
}

此時在再main方法里面執(zhí)行打印的命令:

 public static void main(String[] args) {
     /**
     * 這里使用構(gòu)造方法Cat()在堆內(nèi)存里面new出了兩只貓,
     * 這兩只貓的color,weight,height都是一樣的,
     * 但c1和c2卻永遠不會相等,這是因為c1和c2分別為堆內(nèi)存里面兩只貓的引用對象,
     * 里面裝著可以找到這兩只貓的地址,但由于兩只貓在堆內(nèi)存里面存儲在兩個不同的空間里面,
     * 所以c1和c2分別裝著不同的地址,因此c1和c2永遠不會相等。
     */
     Cat c1 = new Cat(1, 1, 1);
     Cat c2 = new Cat(1, 1, 1);
     System.out.println("c1==c2的結(jié)果是:"+(c1==c2));//false
     System.out.println("c1.equals(c2)的結(jié)果是:"+c1.equals(c2));//true
   }

  這一次得到的結(jié)果就與上次沒有重寫equals()方法時得到的結(jié)果就不一樣了:

  “System.out.println(c1 == c2);”打印出來的結(jié)果依然是false,因為這里是比較兩個對象的引用里面的內(nèi)容,這兩個引用里面的內(nèi)容當然不相等,而且永遠不會相等,所以打印出來的結(jié)果肯定是false。

  “System.out.println(c1.equals(c2));”打印出來的結(jié)果為true,因為我們在Cat類里面重寫了equals()方法,改變了這個方法默認的實現(xiàn),我們把方法的實現(xiàn)改為只要這個兩個對象是真的存在,并且都是貓,并且它們的顏色(color),身高(height)和體重(weight)都相同,那么這兩只貓在邏輯上就是一模一樣的,是完全相同的兩只貓,即這兩只貓是“相等”的。所以這里打印出來的結(jié)果是true。

1.3.如何比較兩個字符串對象是否相等?

看下面的例子:

 public class TestEquals {
   
   public static void main(String args[]){
     String s1 = new String("hello");
     String s2 = new String("hello");
     System.out.println("s1 == s2的結(jié)果是:"+(s1 == s2));//false
     System.out.println("s1.equals(s2)的結(jié)果是:"+s1.equals(s2));//true
   }
 }

這一次是比較兩個字符串對象是否相等:

  System.out.println(s1 == s2);

  打印出來的結(jié)果依然是fase,因為這里比較的是s1和s2兩個字符串對象的引用,兩個對象的引用永遠不會相等,所以打印出來的結(jié)果為false。

  System.out.println(s1.equals(s2));

  打印出來的結(jié)果為true,因為在String類里面重寫了從Object類繼承(所有的類都是從Object類繼承下來,String類當然也不例外,從父類繼承下來就擁有了父類的一切屬性與方法,所以Sting類里面也有equals()方法,并且還把這個繼承下來的equals()方法重寫了)下來的equals()方法,改變了這個方法默認的實現(xiàn),

  在String類里面是這樣重寫equals()方法的實現(xiàn)的:用當前的這個字符串對象和指定的字符串對象比較,指定的字符串對象不能為空并且這個對象的字符序列和當前這個字符串對象的字符串序列一樣,如果這些條件都滿足,那么這兩個字符串對象就是相等的。

因此這里的s2已經(jīng)滿足了條件,所以打印出來的結(jié)果是true。

  以后在某一個類里面比較兩個對象是否相等時,首先去API文檔里面查找這個類是否重寫了從Object類繼承下來的equals()方法。如果重寫了equals()方法,那么在比較兩個對象是否相等時調(diào)用的就是重寫以后的equals()方法,如果沒有重寫,那么調(diào)用時就是直接調(diào)用從Object類里面的繼承下來的那個equals()方法,并且采用equals()方法默認的實現(xiàn)去比較兩個對象是否相等。因此每一個類都可以根據(jù)需要對從Object類繼承下來的equals()方法進行重寫。

  對于在API文檔里面找某個類,如果一個類不用引入包就可以直接使用,那么這個類肯定是在java.lang這個包里面,如這里的String類,直接就可以使用了,所以String類一定是在java.lang這個包里面。使用某個類時看這個類引入的是哪個包,然后就去這個包里面找這個類,不用引入包的類一定是位于java.lang里面,直接去java.lang里面找就可以了。

  總結(jié):比較兩個對象是否相等,我們采用equals()方法,判斷兩個對象是否相等的條件是由我們重寫equals()方法的實現(xiàn)后定義的,這樣就可以比較靈活地使用equals()方法在不同的類里面比較位于同一類下的兩個對象是否相等了。

相關(guān)文章

  • 基于Java編寫一個PDF與Word文件轉(zhuǎn)換工具

    基于Java編寫一個PDF與Word文件轉(zhuǎn)換工具

    前段時間一直使用到word文檔轉(zhuǎn)pdf或者pdf轉(zhuǎn)word,尋思著用Java應該是可以實現(xiàn)的,于是花了點時間寫了個文件轉(zhuǎn)換工具,感興趣的可以了解一下
    2023-01-01
  • 詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器

    詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器

    這篇文章主要介紹了詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • SpringBoot使用Redis單機版過期鍵監(jiān)聽事件的實現(xiàn)示例

    SpringBoot使用Redis單機版過期鍵監(jiān)聽事件的實現(xiàn)示例

    在緩存的使用場景中經(jīng)常需要使用到過期事件,本文主要介紹了SpringBoot使用Redis單機版過期鍵監(jiān)聽事件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Spring?Retry?實現(xiàn)樂觀鎖重試實踐記錄

    Spring?Retry?實現(xiàn)樂觀鎖重試實踐記錄

    本文介紹了在秒殺商品SKU表中使用樂觀鎖和MybatisPlus配置樂觀鎖的方法,并分析了測試環(huán)境和生產(chǎn)環(huán)境的隔離級別對樂觀鎖的影響,通過簡單驗證,展示了在可重復讀和讀已提交隔離級別下的不同行為,感興趣的朋友一起看看吧
    2025-03-03
  • 詳解springboot如何更新json串里面的內(nèi)容

    詳解springboot如何更新json串里面的內(nèi)容

    這篇文章主要為大家介紹了springboot 如何更新json串里面的內(nèi)容,文中有詳細的解決方案供大家參考,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • Spring整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案

    Spring整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案

    這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 使用Socket正確讀取數(shù)據(jù)姿勢

    Java 使用Socket正確讀取數(shù)據(jù)姿勢

    這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java跨域問題分析與解決方法詳解

    Java跨域問題分析與解決方法詳解

    這篇文章主要介紹了Java跨域問題分析與解決方法,跨域問題是在Web應用程序中,由于同源策略的限制,導致瀏覽器無法發(fā)送跨域請求,也無法獲取跨域響應的問題,感興趣想要詳細了解可以參考下文
    2023-05-05
  • 解決SpringBoot配置文件項目重啟出現(xiàn)亂碼的問題

    解決SpringBoot配置文件項目重啟出現(xiàn)亂碼的問題

    最近在創(chuàng)建了SpringBoot項目后往配置文件中寫了相關(guān)的系統(tǒng)配置,并且在上面加了中文注釋,但是在重啟項目或開機重啟后遇到了注釋亂碼的情況,下面這篇文章主要給大家介紹一下如何解決SpringBoot配置文件項目重啟出現(xiàn)亂碼的問題,需要的朋友可以參考下
    2023-06-06
  • Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算

    Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算

    這篇文章主要介紹了Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算,本文通過實例代碼給大家介紹的非常想詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論

海淀区| 大新县| 贡觉县| 中宁县| 唐河县| 六枝特区| 江城| 定襄县| 芮城县| 张家口市| 大渡口区| 工布江达县| 鄱阳县| 吉安市| 舞钢市| 兴山县| 启东市| 冀州市| 贞丰县| 东阿县| 长岭县| 磴口县| 乃东县| 景德镇市| 菏泽市| 邢台市| 和田县| 都匀市| 安庆市| 开鲁县| 湖北省| 时尚| 揭东县| 扎赉特旗| 太白县| 余江县| 得荣县| 陵川县| 华安县| 区。| 静乐县|