一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - java必學(xué)必會之equals方法

java必學(xué)必會之equals方法

2020-03-07 14:49孤傲蒼狼 JAVA教程

java必學(xué)必會之equals方法,equals方法是 java.lang.Object 類的方法,想要了解更多關(guān)于equals方法的朋友,可以參考下文

一、equals方法介紹

java必學(xué)必會之equals方法

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package cn.galc.test;
public class TestEquals {
  public static void main(String[] args) {
    /**
     * 這里使用構(gòu)造方法Cat()在堆內(nèi)存里面new出了兩只貓,
     * 這兩只貓的color,weight,height都是一樣的,
     * 但c1和c2卻永遠(yuǎn)不會相等,這是因?yàn)閏1和c2分別為堆內(nèi)存里面兩只貓的引用對象,
     * 里面裝著可以找到這兩只貓的地址,但由于兩只貓?jiān)诙褍?nèi)存里面存儲在兩個(gè)不同的空間里面,
     * 所以c1和c2分別裝著不同的地址,因此c1和c2永遠(yuǎn)不會相等。
     */
    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)存之中的布局如下圖所示,

java必學(xué)必會之equals方法

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

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

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

public boolean equals(Object obj)

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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()方法,改變這個(gè)方法默認(rèn)的實(shí)現(xiàn),
   * 通過我們自己定義的實(shí)現(xiàn)來判斷決定兩個(gè)對象在邏輯上是否相等。
   * 這里我們定義如果兩只貓的color,weight,height都相同,
   * 那么我們就認(rèn)為這兩只貓?jiān)谶壿嬌鲜且荒R粯拥模催@兩只貓是“相等”的。
   */
  public boolean equals(Object obj){
    if (obj==null){
      return false;
    }
    else{
      /**
       * instanceof是對象運(yùn)算符。
       * 對象運(yùn)算符用來測定一個(gè)對象是否屬于某個(gè)指定類或指定的子類的實(shí)例。
       * 對象運(yùn)算符是一個(gè)組合單詞instanceof。
       * 該運(yùn)算符是一個(gè)雙目運(yùn)算符,其左邊的表達(dá)式是一個(gè)對象,右邊的表達(dá)式是一個(gè)類,
       * 如果左邊的對象是右邊的類創(chuàng)建的對象,則運(yùn)算結(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;
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
    /**
    * 這里使用構(gòu)造方法Cat()在堆內(nèi)存里面new出了兩只貓,
    * 這兩只貓的color,weight,height都是一樣的,
    * 但c1和c2卻永遠(yuǎn)不會相等,這是因?yàn)閏1和c2分別為堆內(nèi)存里面兩只貓的引用對象,
    * 里面裝著可以找到這兩只貓的地址,但由于兩只貓?jiān)诙褍?nèi)存里面存儲在兩個(gè)不同的空間里面,
    * 所以c1和c2分別裝著不同的地址,因此c1和c2永遠(yuǎn)不會相等。
    */
    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()方法時(shí)得到的結(jié)果就不一樣了:

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

  “System.out.println(c1.equals(c2));”打印出來的結(jié)果為true,因?yàn)槲覀冊贑at類里面重寫了equals()方法,改變了這個(gè)方法默認(rèn)的實(shí)現(xiàn),我們把方法的實(shí)現(xiàn)改為只要這個(gè)兩個(gè)對象是真的存在,并且都是貓,并且它們的顏色(color),身高(height)和體重(weight)都相同,那么這兩只貓?jiān)谶壿嬌暇褪且荒R粯拥模峭耆嗤膬芍回垼催@兩只貓是“相等”的。所以這里打印出來的結(jié)果是true。

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

看下面的例子:

?
1
2
3
4
5
6
7
8
9
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
  }
}

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

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

  打印出來的結(jié)果依然是fase,因?yàn)檫@里比較的是s1和s2兩個(gè)字符串對象的引用,兩個(gè)對象的引用永遠(yuǎn)不會相等,所以打印出來的結(jié)果為false。

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

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

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

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久亚洲成a人片 | 国产午夜精品久久久久 | 青青草原伊人网 | 国内精品久久久久久久久 | 9久久9久久精品 | 亚洲国产精品自在自线观看 | 国产欧美综合一区二区 | 风间由美在线 | 欧美性高清另类videosex死尸 | 免费观看视频在线 | 性猛交娇小69hd| 毛片一级免费 | 四虎在线精品观看免费 | 99ri在线精品视频在线播放 | 牛牛在线观看 | 日本视频免费在线观看 | 欧美午夜精品久久久久久黑人 | 亚洲精品无码久久不卡 | 成人国产在线视频在线观看 | 国产真实偷乱视频在线观看 | 成人小视频在线免费观看 | 日韩在线二区 | 免费国产成人α片 | 无人区在线观看免费视频国语 | 国产精品亚洲片在线观看麻豆 | 亚洲 欧美 清纯 校园 另类 | 国产毛片一级aaaaa片 | 亚洲精品久久啪啪网站成年 | 好吊操这里有精品 | 亚洲AV永久无码精品澳门 | 大东北chinesexxxx露脸 | 激情婷婷综合久久久久 | 翁息肉小说老扒 | 亚洲 欧美 清纯 校园 另类 | 国色天香视频完整版 | 日本一区免费观看 | 国产精品久久毛片蜜月 | 青草视频网站在线观看 | 高清欧美不卡一区二区三区 | 午夜影院一区二区三区 | 男人天堂a|