欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中equals方法使用及重寫練習

 更新時間:2023年05月31日 14:42:58   作者:m1m-FG  
equals是在object類中的方法,在object中equals是用來看看兩個參數(shù)是否引用的是同一個對象,下面這篇文章主要給大家介紹了關(guān)于Java中equals方法使用及重寫練習的相關(guān)資料,需要的朋友可以參考下

一、"=="運算符

"=="是一個比較運算符。

  • "=="既可以判斷基本類型,又可以判斷引用類型。
  • "=="如果判斷基本類型,判斷的是值是否相等。eg: int i=10; double d=10.0
  • "=="如果判斷引用類型,判斷的是地址是否相等,即判定是不是同一個對象。

二、equals方法

  • equals是object類中的方法,只能用于判斷引用類型
  • equals方法默認判斷的是地址是否相等,子類中往往重寫該方法,用于判斷內(nèi)容是否相等。比如String和Integer類中的equals源代碼。

Object類中的equals方法的源碼:

Object類中的equals方法默認就是比較對象地址是否相同。

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

"hello".equals("abc");

解釋:this指的就是當前對象,this是指equals方法是誰調(diào)用的,上面的hello調(diào)用的equals,所以this指的是字符串hello,而==右邊的obj對象,是傳入的abc。

三、重寫equals方法練習

練習一:

package object;
/*
判斷兩個person對象的內(nèi)容是否相等
如果兩個person對象的各個屬性值都一樣,則返回true,反之返回false
 */
public class EqualsExercise {
    public static void main(String[] args) {
        Person person1 = new Person("jack", 10, '男');
        Person person2 = new Person("jack", 10, '男');
        System.out.println(person1.equals(person2));   //輸出結(jié)果是true
    }
}
class Person {
    private String name;
    private int age;
    private char gender;
    //重寫Object的equals方法
    public boolean equals(Object obj) {
        //如果比較的兩個對象是同一個對象,則直接返回true
        if (this == obj){   //this就代表調(diào)用equals方法的那個對象,obj就是方法里面的實參
            return true;
        }
        //類型判斷
        if (obj instanceof Person){  //obj是Person,我們才比較
            //進行 向下轉(zhuǎn)型(即obj轉(zhuǎn)成Person); 因為我需要得到obj的各個屬性,如果不轉(zhuǎn)型,拿不到
            Person p = (Person) obj;
            return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
        }
        //如果不是person,則直接返回false;總不能拿一個人跟一個狗比
        return false;
    }
    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public char getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }
}

Tips:

instanceof的用法:result = object instanceof class

instanceof左邊是對象,右邊是類;當對象是右邊類或子類所創(chuàng)建對象時,返回true;否則,返false。

練習二:

 解釋:

  • sout1:p1和p2都是對象,因此==判斷的是地址是否相同,false
  • sout2:p1.name和p2.name都是字符串,因此這里的equals調(diào)用的是String類的中的equals方法,判斷的是內(nèi)容是否相同,true
  • sout3:p1和p2都是對象,因此這里的equals是Object類中的equals方法,判斷的是地址是否相同,false
  • sout4:s1和s2都是String類的對象,因此這里的equals調(diào)用的是String類的中的equals方法,判斷的是內(nèi)容是否相同,true
  • sout5:s1和s2都是對象,因此==判斷的是地址是否相同,false

練習三:

 解釋:

  • sout1:65和65.0是相等的,true
  • sout2:字符的本質(zhì)還是數(shù)字,查閱AscII表,A就是12,true
  • sout3:沒啥說的
  • sout4:沒啥說的
  • sout5:沒啥說的
  • sout6:都不是同一種類型,==直接編譯錯誤

補充:在Java中比較的推薦方法

所以我們一般比較基本數(shù)據(jù)類型的時候,使用"==",例如 int i = 0; if (i == 1){…},比較兩個Integer包裝類類型的時候就可以使用equals(),因為Java已經(jīng)重寫了equals()方法了。另外給出幾點建議,在java中進行比較,我們需要根據(jù)比較的類型來選擇合適的比較方式:

  1. 對象域,使用equals方法 。
  2. 類型安全的枚舉,使用equals或== 。
  3. 可能為null的對象域 : 使用==null 和 equals 。
  4. 數(shù)組域 : 使用 Arrays.equals 。
  5. 除float和double外的原始數(shù)據(jù)類型(int,byte等) : 使用 == 。
  6. float類型: 使用Float.foatToIntBits轉(zhuǎn)換成int類型,然后使用==。
  7. double類型: 使用Double.doubleToLongBit轉(zhuǎn)換成long類型,然后使用==。
    其中6,7參考java中的對應的包裝類實現(xiàn):
public boolean equals(Object obj) {
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }
}

為什么要在我們自己的類中重寫equals()

但是有時候我們不滿足于使用基本數(shù)據(jù)類型和Java實現(xiàn)的一些繼承自Object的哪些類,比如我們實現(xiàn)一個Person類,它是繼承自Object類的,所以它的equals()方法默認使用的是文章開頭提到的哪個equals()方法,當我們使用equals()進行比較的時候,比較內(nèi)存地址,那么有可能出現(xiàn)兩個Person對象的參數(shù)都相同(比如年齡,身份證號等,在我們的實際認知中認為這兩個人就是一個人,應該返回true),但是由于他們的內(nèi)存地址是不一樣的,所以equals()方法會返回false。

那么我們就需要去重寫equals()方法。

總結(jié) 

到此這篇關(guān)于Java中equals方法使用及重寫練習的文章就介紹到這了,更多相關(guān)Java中equals方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot使用filter獲取自定義請求頭的實現(xiàn)代碼

    springboot使用filter獲取自定義請求頭的實現(xiàn)代碼

    這篇文章主要介紹了springboot使用filter獲取自定義請求頭的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 詳解shiro緩存機制

    詳解shiro緩存機制

    Shiro提供了類似于Spring的Cache抽象,即Shiro本身不實現(xiàn)Cache,但是對Cache進行了又抽象,方便更換不同的底層Cache實現(xiàn)。下面通過實例代碼給大家分享shiro緩存機制,感興趣的朋友一起看看吧
    2017-09-09
  • 一篇文章帶你入門Java變量

    一篇文章帶你入門Java變量

    這篇文章主要介紹了Java變量,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Java基礎學習之ArrayList類概述與常用方法

    Java基礎學習之ArrayList類概述與常用方法

    這篇文章主要為大家簡單的介紹Java中ArrayList類的概述、常用方法及存儲字符串并遍歷,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-08-08
  • 詳解SpringMVC中的四種跳轉(zhuǎn)方式、視圖解析器問題

    詳解SpringMVC中的四種跳轉(zhuǎn)方式、視圖解析器問題

    這篇文章主要介紹了SpringMVC的四種跳轉(zhuǎn)方式、視圖解析器,springmvc核心配置文件和視圖解析器的使用,添加視圖解析器,通過案例講解四種跳轉(zhuǎn)方式,需要的朋友可以參考下
    2022-10-10
  • Java及Android中常用鏈式調(diào)用寫法簡單示例

    Java及Android中常用鏈式調(diào)用寫法簡單示例

    這篇文章主要介紹了Java及Android中常用鏈式調(diào)用寫法,結(jié)合實例形式分析了java編程中的鏈式調(diào)用概念、簡單使用方法及相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Spring框架實現(xiàn)依賴注入的原理

    Spring框架實現(xiàn)依賴注入的原理

    依賴注入是由“依賴”和“注入”兩個詞匯組合而成,那么我們再一次順藤摸瓜,分別分析這兩個詞語,這篇文章主要介紹了Spring DI依賴注入詳解,需要的朋友可以參考下
    2023-04-04
  • Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦

    Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦

    在項目開發(fā)過程中需要根據(jù)兩地經(jīng)緯度坐標計算兩地間距離,下面這篇文章主要給大家介紹了關(guān)于Java根據(jù)坐標經(jīng)緯度計算兩點距離5種方法以及校驗經(jīng)緯度是否在圓/多邊形區(qū)域內(nèi)的算法推薦,需要的朋友可以參考下
    2023-12-12
  • spring?jpa?審計功能自定義填充字段方式

    spring?jpa?審計功能自定義填充字段方式

    這篇文章主要介紹了spring?jpa審計功能自定義填充字段方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • MybatisPlus修改時空字段無法修改的解決方案

    MybatisPlus修改時空字段無法修改的解決方案

    這篇文章主要介紹了MybatisPlus修改時空字段無法修改的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論