亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java基礎學習總結——equals方法

2019-11-06 06:30:56
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

一、equals方法介紹

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

復制代碼
 1 package cn.galc.test; 2  3 public class TestEquals { 4     public static void main(String[] args) { 5         /** 6          * 這里使用構造方法Cat()在堆內存里面new出了兩只貓, 7          * 這兩只貓的color,weight,height都是一樣的, 8          * 但c1和c2卻永遠不會相等,這是因為c1和c2分別為堆內存里面兩只貓的引用對象, 9          * 里面裝著可以找到這兩只貓的地址,但由于兩只貓在堆內存里面存儲在兩個不同的空間里面,10          * 所以c1和c2分別裝著不同的地址,因此c1和c2永遠不會相等。11          */12         Cat c1 = new Cat(1, 1, 1);13         Cat c2 = new Cat(1, 1, 1);14         System.out.PRintln("c1==c2的結果是:"+(c1==c2));//false15         System.out.println("c1.equals(c2)的結果是:"+c1.equals(c2));//false16     }17 }18 19 class Cat {20     int color, weight, height;21 22     public Cat(int color, int weight, int height) {23         this.color = color;24         this.weight = weight;25         this.height = height;26     }27 }復制代碼

1.2.畫出內存分析圖分析c1和c2比較的結果

程序:

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

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

執行完之后內存之中的布局如下圖所示,

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

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

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

public boolean equals(Object obj)

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

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

復制代碼
 1 class Cat { 2     int color, weight, height; 3  4     public Cat(int color, int weight, int height) { 5         this.color = color; 6         this.weight = weight; 7         this.height = height; 8     } 9     10     /**11      * 這里是重寫相等從Object類繼承下來的equals()方法,改變這個方法默認的實現,12      * 通過我們自己定義的實現來判斷決定兩個對象在邏輯上是否相等。13      * 這里我們定義如果兩只貓的color,weight,height都相同,14      * 那么我們就認為這兩只貓在邏輯上是一模一樣的,即這兩只貓是“相等”的。15      */16     public boolean equals(Object obj){17         if (obj==null){18             return false;19         }20         else{21             /**22              * instanceof是對象運算符。23              * 對象運算符用來測定一個對象是否屬于某個指定類或指定的子類的實例。24              * 對象運算符是一個組合單詞instanceof。25              * 該運算符是一個雙目運算符,其左邊的表達式是一個對象,右邊的表達式是一個類,26              * 如果左邊的對象是右邊的類創建的對象,則運算結果為true,否則為false。27              */28             if (obj instanceof Cat){29                 Cat c = (Cat)obj;30                 if (c.color==this.color && c.weight==this.weight && c.height==this.height){31                     return true;32                 }33             }34         }35         return false;36     }37 }復制代碼

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

復制代碼
 1 public static void main(String[] args) { 2         /** 3          * 這里使用構造方法Cat()在堆內存里面new出了兩只貓, 4          * 這兩只貓的color,weight,height都是一樣的, 5          * 但c1和c2卻永遠不會相等,這是因為c1和c2分別為堆內存里面兩只貓的引用對象, 6          * 里面裝著可以找到這兩只貓的地址,但由于兩只貓在堆內存里面存儲在兩個不同的空間里面, 7          * 所以c1和c2分別裝著不同的地址,因此c1和c2永遠不會相等。 8          */ 9         Cat c1 = new Cat(1, 1, 1);10         Cat c2 = new Cat(1, 1, 1);11         System.out.println("c1==c2的結果是:"+(c1==c2));//false12         System.out.println("c1.equals(c2)的結果是:"+c1.equals(c2));//true13     }復制代碼

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

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

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

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

看下面的例子:

復制代碼
1 public class TestEquals {2     3     public static void main(String args[]){4         String s1 = new String("hello");5         String s2 = new String("hello");6         System.out.println("s1 == s2的結果是:"+(s1 == s2));//false7         System.out.println("s1.equals(s2)的結果是:"+s1.equals(s2));//true8     }9 }復制代碼

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

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

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

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

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

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

因此這里的s2已經滿足了條件,所以打印出來的結果是true。

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

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

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

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲国产视频| 91在线观看免费高清| 国产不卡av在线| 亚洲综合视频1区| 国产精品色婷婷视频| 欧美日韩另类在线| 欧美激情第6页| 国产91av在线| 亚洲高清久久网| 欧美日韩成人在线观看| 日韩电影免费观看在线观看| 久久韩剧网电视剧| 九九热视频这里只有精品| 91亚洲精品久久久久久久久久久久| 亚洲激情自拍图| 亚洲精品美女久久久| 久久高清视频免费| 国产成人精品免费久久久久| 欧美一级在线播放| 久久天天躁狠狠躁夜夜av| 日韩欧美在线字幕| 久久久久久尹人网香蕉| 国产ts一区二区| 国内精品视频久久| 亚洲色图综合久久| 91在线高清免费观看| 亚洲精品国产精品久久清纯直播| 欧日韩不卡在线视频| 成人黄色免费片| 中文字幕亚洲专区| 亚洲精品久久久久久久久久久久| 日韩av在线免费看| 亚洲色图13p| www.午夜精品| 久久99精品久久久久久噜噜| 国产精品偷伦视频免费观看国产| 亚洲系列中文字幕| 久久久精品免费| 国产精品福利片| 国产在线视频不卡| 久久久免费av| 日韩中文字幕在线免费观看| 最新91在线视频| 夜夜嗨av一区二区三区免费区| 久久久久久久国产精品视频| 久久国产精品视频| 成人黄色免费片| 国产成人欧美在线观看| 亚洲乱码一区av黑人高潮| 亚洲黄页视频免费观看| 国产女同一区二区| 亚洲人在线观看| 美女撒尿一区二区三区| 亚洲专区中文字幕| 亚洲一区二区国产| 91色在线观看| 国产精品九九久久久久久久| 亚洲大胆人体视频| 久久亚洲精品小早川怜子66| 91国产在线精品| 欧美亚洲日本黄色| 中文字幕日韩在线播放| 一区二区三区 在线观看视| 欧美天天综合色影久久精品| 日韩av综合中文字幕| 97色在线播放视频| 国产99在线|中文| 亚洲影影院av| 欧美亚洲一区在线| 亚洲精品小视频在线观看| 免费不卡欧美自拍视频| 日韩高清免费观看| 黑人巨大精品欧美一区二区一视频| 亚洲国产精品视频在线观看| 亚洲激情视频在线播放| 欧美在线激情网| 成人精品在线视频| 成人黄色免费片| 欧美成人h版在线观看| 伊人伊成久久人综合网小说| x99av成人免费| 国产精品美女久久| 亚洲美女视频网站| 精品亚洲一区二区三区四区五区| 亚洲国产欧美一区| 黑人精品xxx一区| 亚洲jizzjizz日本少妇| 亚洲精品videossex少妇| 日韩高清电影免费观看完整| 97在线视频免费播放| 欧美激情亚洲一区| 国产91精品久| 国产精品1区2区在线观看| 欧美诱惑福利视频| 久久久亚洲成人| 狠狠躁天天躁日日躁欧美| 国产精品视频26uuu| 国产成人av网址| 国产精品一区二区久久久久| 日韩视频在线观看免费| 国产精品久久久久久亚洲影视| 欧美限制级电影在线观看| 欧美专区日韩视频| 日韩欧美有码在线| 久久99精品国产99久久6尤物| 国产视频精品久久久| 日本道色综合久久影院| 国产精品扒开腿做爽爽爽视频| 久久精品2019中文字幕| 精品国产一区二区三区四区在线观看| 91深夜福利视频| 在线观看欧美成人| 久久伊人免费视频| 亚洲日本欧美日韩高观看| 国产精品极品尤物在线观看| 69影院欧美专区视频| 操日韩av在线电影| 日韩欧美亚洲一二三区| 中文字幕亚洲二区| 亚洲自拍中文字幕| 国产精品r级在线| 亚洲sss综合天堂久久| 45www国产精品网站| 国产成人精品日本亚洲| 欧美一级视频免费在线观看| 国产成人精品日本亚洲| 91免费的视频在线播放| 一区二区成人精品| 亚洲精品自拍第一页| 国产精品白丝av嫩草影院| 色婷婷av一区二区三区在线观看| 国产精品美腿一区在线看| 欧美成人免费大片| 成人免费xxxxx在线观看| 精品久久久视频| 亚洲国产精品va| www日韩中文字幕在线看| 久久久久久久久久婷婷| 高清欧美电影在线| 性夜试看影院91社区| 91国产美女在线观看| 97色在线播放视频| 中文字幕日韩在线视频| 欧美日韩综合视频网址| 亚洲xxxxx性| 成人黄色av免费在线观看| 91国语精品自产拍在线观看性色| 精品亚洲一区二区| 亚洲成人aaa| 2018日韩中文字幕| 久久久久久尹人网香蕉| 不卡中文字幕av| 国产精品户外野外| 中文字幕久精品免费视频| 日韩精品久久久久| 91精品国产乱码久久久久久久久| 日韩视频在线观看免费| 午夜精品久久久99热福利| 欧洲成人午夜免费大片| 日本韩国在线不卡| 亚洲自拍偷拍在线| 久久久精品999| 97久久超碰福利国产精品…| 欧美高清在线播放|