站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        equals()函數(shù)與“==”的作用分別是什么

        equals()函數(shù)與“==”的作用分別是什么

        首先,來看看它們的區(qū)別:

        (推薦學(xué)習(xí):java入門程序)

        • equals()方法用來比較的是兩個對象的內(nèi)容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象,如果沒有對該方法進(jìn)行覆蓋的話,調(diào)用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷;

        • "==" 比較的是變量(棧)內(nèi)存中存放的對象的(堆)內(nèi)存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。

        equals()作用

        equals() 的作用是用來判斷兩個對象是否相等。

        equals() 定義在JDK的Object.java中。通過判斷兩個對象的地址是否相等(即,是否是同一個對象)來區(qū)分它們是否相等。源碼如下:

        public boolean equals(Object obj) {     return (this == obj); }

        既然Object.java中定義了equals()方法,這就意味著所有的Java類都實(shí)現(xiàn)了equals()方法,所有的類都可以通過equals()去比較兩個對象是否相等。

        但是,我們已經(jīng)說過,使用默認(rèn)的“equals()”方法,等價于“==”方法。因此,我們通常會重寫equals()方法:若兩個對象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。

        下面根據(jù)"類是否覆蓋equals()方法",將它分為2類。

        • 若某個類沒有覆蓋equals()方法,當(dāng)它通過equals()比較兩個對象時,實(shí)際上是比較兩個對象是不是同一個對象。這時,等價于通過“==”去比較這兩個對象。

        • 我們可以覆蓋類的equals()方法,來讓equals()通過其它方式比較兩個對象是否相等。通常的做法是:若兩個對象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。

        下面,舉例對上面的兩種情況進(jìn)行說明:

        1、沒有覆蓋equals()方法的情況

        public class EqualsTest {     public static void main(String[] args) {         // 新建2個相同內(nèi)容的Person對象,         // 再用equals比較它們是否相等         User user1 = new User("James", 100);         User user2 = new User("James", 100);         System.out.printf("比較結(jié)果:" + user1.equals(user2));     }       /**      * @desc User類。      */     static class User {         int age;         String name;           public User(String name, int age) {             this.name = name;             this.age = age;         }           public String toString() {             return name + " - " + age;         }     } }

        運(yùn)行結(jié)果:

        false

        結(jié)果分析:

        我們通過 user1.equals(user2) 來“比較user1和user2是否相等時”,實(shí)際上,調(diào)用的Object.java的equals()方法,即調(diào)用的 (user1==user2) 。

        它是比較“p1和p2是否是同一個對象”。而由 user1 和 user2 的定義可知,它們雖然內(nèi)容相同;但它們是兩個不同的對象,因此,返回結(jié)果是false。

        (視頻教程推薦:java視頻教程)

        2、覆蓋equals()方法的情況

        修改上面的EqualsTest,覆蓋equals()方法:

        public class EqualsTest {     public static void main(String[] args) {         // 新建2個相同內(nèi)容的Person對象,         // 再用equals比較它們是否相等         User user1 = new User("James", 100);         User user2 = new User("James", 100);         System.out.printf("比較結(jié)果:" + user1.equals(user2));     }       /**      * @desc User類。      */     static class User {         int age;         String name;           public User(String name, int age) {             this.name = name;             this.age = age;         }           public String toString() {             return name + " - " + age;         }           @Override         public boolean equals(Object obj) {             if (this == obj)                 return true;             if (obj == null)                 return false;             if (getClass() != obj.getClass())                 return false;             User other = (User) obj;             if (age != other.age)                 return false;             if (name == null) {                 if (other.name != null)                     return false;             } else if (!name.equals(other.name))                 return false;             return true;         }     } }

        運(yùn)行結(jié)果:

        true

        結(jié)果分析:我們在EqualsTest.java 中重寫了User的equals()函數(shù):當(dāng)兩個User對象的 name 和 age 都相等,則返回true。因此,運(yùn)行結(jié)果返回true。

        == 的作用

        “==”:它的作用是判斷兩個對象的地址是不是相等。即判斷引用對象是不是指向的堆中的同一個對象,我們知道,凡是new出來的對象都在堆中。而對象的引用都存放在棧中,具體來講就是放在棧幀中,我們來看下面一段代碼:

        public static void main(String[] args) {         User user1 = new User("James", 100);         User user2 = new User("James", 100);         System.out.println("user1.equals(user2):" + user1.equals(user2));         System.out.println("user1==user2:" + (user1==user2)); }

        輸出結(jié)果:

        user1.equals(user2):true user1==user2:false

        指向的是堆中兩塊不同的區(qū)域,所以用 "==" 比較時返回的是false。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 9久久9久久精品| 欧美精品在线一区二区三区| 精品福利一区二区三区免费视频 | 国产精品久久久久9999| 日韩视频中文字幕精品偷拍| 四虎在线精品视频一二区 | 影院无码人妻精品一区二区 | 久久精品女人天堂AV麻| 国产亚洲综合成人91精品| 爽爽精品dvd蜜桃成熟时电影院| 国产中文在线亚洲精品官网| 亚洲精品视频在线| 国产精品一国产精品| 国产色婷婷五月精品综合在线| 一本一本久久aa综合精品| 久久精品免费网站网| 精品国产福利尤物免费| 国产成人精品综合在线观看| 欧美精品免费观看二区| 国产精品久久久久久久久鸭| 国产午夜福利精品久久2021| 久久精品aⅴ无码中文字字幕重口| 最新国产精品精品视频| 亚洲精品高清一二区久久| 久久久久人妻一区精品| 久久精品国产国产精品四凭 | 国产精品9999久久久久| 亚洲精品无码成人AAA片| 亚洲精品成人在线| 亚洲国产精品一区二区第四页| 麻豆国产高清精品国在线| 久久久久成人精品无码| 精品久久久久久无码免费| 国产在线观看高清精品| 免费观看四虎精品成人| 久久精品国产一区二区| 午夜国产精品无套| 亚洲综合av永久无码精品一区二区| 亚洲精品自产拍在线观看| 日韩精品乱码AV一区二区| 精品无码一区在线观看|