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

Java中equals()方法的理解與使用方法例子

 更新時(shí)間:2024年10月26日 11:12:54   作者:正在成為大牛的小菜雞  
本文主要介紹了Java中的equals()方法,equals()方法是Object類的方法,用于比較兩個(gè)對(duì)象是否相等,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

在Java中,equals()方法是用于比較兩個(gè)對(duì)象是否相等的重要方法。它屬于Object類的方法,因此所有的Java對(duì)象都繼承了這個(gè)方法。但是,Object類中的equals()方法默認(rèn)實(shí)現(xiàn)是比較兩個(gè)對(duì)象的引用是否相同,即它們是否指向內(nèi)存中的同一個(gè)對(duì)象。在實(shí)際開發(fā)中,我們往往需要根據(jù)對(duì)象的實(shí)際內(nèi)容來判斷是否相等,這時(shí)就需要重寫equals()方法。

一、equals()方法的理解

equals()方法用于比較兩個(gè)對(duì)象的內(nèi)容是否相等,而不是比較它們的引用是否相同。例如,我們有兩個(gè)Person對(duì)象,它們的姓名和年齡都相同,但它們是兩個(gè)獨(dú)立的對(duì)象,存儲(chǔ)在內(nèi)存中的不同位置。如果我們想要判斷這兩個(gè)對(duì)象是否“相等”(即它們的屬性都相同),就需要重寫equals()方法。

二、equals()方法的使用

1. 重寫equals()方法

當(dāng)我們需要比較兩個(gè)對(duì)象的內(nèi)容是否相等時(shí),需要重寫equals()方法。重寫時(shí),需要遵循以下幾個(gè)原則:

  • 自反性:對(duì)于任何非null的引用值x,x.equals(x)必須返回true。
  • 對(duì)稱性:對(duì)于任何非null的引用值x和y,當(dāng)且僅當(dāng)y.equals(x)返回true時(shí),x.equals(y)也必須返回true。
  • 傳遞性:對(duì)于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也應(yīng)該返回true。
  • 一致性:對(duì)于任何非null的引用值x和y,多次調(diào)用x.equals(y)始終返回true或始終返回false,前提是對(duì)象上equals比較中所用的信息沒有被修改。
  • 對(duì)于任何非null的引用值x,x.equals(null)必須返回false。

示例代碼:

public class Person {
    private String name;
    private int age;

    // 構(gòu)造函數(shù)、getter和setter方法省略...

    @Override
    public boolean equals(Object obj) {
        // 1. 檢查是否為同一個(gè)對(duì)象引用
        if (this == obj) {
            return true;
        }
        // 2. 檢查傳入對(duì)象是否為null以及類型是否匹配
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        // 3. 類型匹配,將obj轉(zhuǎn)型為Person類型
        Person other = (Person) obj;
        // 4. 比較屬性是否相等
        return age == other.age &&
               (name == null ? other.name == null : name.equals(other.name));
    }

    @Override
    public int hashCode() {
        // 當(dāng)重寫equals方法時(shí),通常也需要重寫hashCode方法,以維護(hù)hashCode的一般約定
        // 這里使用簡單的計(jì)算方式,實(shí)際應(yīng)用中可能需要更復(fù)雜的計(jì)算來確保散列分布均勻
        return Objects.hash(name, age);
    }
}

2. 使用equals()方法

重寫equals()方法后,我們就可以使用它來比較兩個(gè)對(duì)象的內(nèi)容是否相等了。

示例代碼:

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice", 25);
        Person person2 = new Person("Alice", 25);
        Person person3 = new Person("Bob", 30);

        // 使用equals()方法比較對(duì)象內(nèi)容是否相等
        System.out.println("person1 equals person2: " + person1.equals(person2)); // 輸出:true
        System.out.println("person1 equals person3: " + person1.equals(person3)); // 輸出:false

        // 注意:不要使用 == 來比較對(duì)象內(nèi)容是否相等
        System.out.println("person1 == person2: " + (person1 == person2)); // 輸出:false,因?yàn)閜erson1和person2是兩個(gè)不同的對(duì)象
    }
}

在上面的示例中,我們創(chuàng)建了三個(gè)Person對(duì)象,并使用equals()方法比較了它們的內(nèi)容是否相等。可以看到,即使person1person2是兩個(gè)不同的對(duì)象,但由于它們的屬性相同,所以person1.equals(person2)返回true。而person1person3的屬性不同,所以person1.equals(person3)返回false。

總結(jié)

equals()方法在Java中扮演著非常重要的角色,特別是在處理對(duì)象比較時(shí)。默認(rèn)情況下,equals()方法繼承自Object類,僅僅比較兩個(gè)對(duì)象的引用是否相同,即它們是否指向內(nèi)存中的同一個(gè)位置。然而,在實(shí)際應(yīng)用中,我們往往需要根據(jù)對(duì)象的實(shí)際內(nèi)容(即對(duì)象的屬性)來判斷它們是否相等。這時(shí),就需要重寫equals()方法。

重寫equals()方法時(shí),需要遵循自反性、對(duì)稱性、傳遞性、一致性和對(duì)于非null對(duì)象與null比較的規(guī)則。在比較對(duì)象屬性時(shí),如果屬性也是對(duì)象,那么應(yīng)該遞歸地調(diào)用這些對(duì)象的equals()方法進(jìn)行比較,而不是簡單地使用==操作符。

另外,當(dāng)重寫equals()方法時(shí),通常也需要重寫hashCode()方法,以確保兩個(gè)相等的對(duì)象具有相同的哈希碼。這是因?yàn)樵贘ava中,很多集合類(如HashSet、HashMap等)都依賴于hashCode()方法來實(shí)現(xiàn)高效的元素存儲(chǔ)和檢索。

使用equals()方法時(shí),要注意不要與==操作符混淆。==操作符用于比較兩個(gè)對(duì)象的引用是否相同,而equals()方法用于比較兩個(gè)對(duì)象的內(nèi)容是否相等。

總之,理解并正確使用equals()方法是Java編程中必不可少的一部分。通過重寫equals()方法,我們可以根據(jù)對(duì)象的實(shí)際內(nèi)容來判斷它們是否相等,從而更準(zhǔn)確地處理對(duì)象比較的邏輯。同時(shí),也要注意與==操作符的區(qū)別,避免在代碼中產(chǎn)生邏輯錯(cuò)誤。

附:重寫equals方法練習(xí)

package object;
/*
判斷兩個(gè)person對(duì)象的內(nèi)容是否相等
如果兩個(gè)person對(duì)象的各個(gè)屬性值都一樣,則返回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) {
        //如果比較的兩個(gè)對(duì)象是同一個(gè)對(duì)象,則直接返回true
        if (this == obj){   //this就代表調(diào)用equals方法的那個(gè)對(duì)象,obj就是方法里面的實(shí)參
            return true;
        }
        //類型判斷
        if (obj instanceof Person){  //obj是Person,我們才比較
            //進(jìn)行 向下轉(zhuǎn)型(即obj轉(zhuǎn)成Person); 因?yàn)槲倚枰玫給bj的各個(gè)屬性,如果不轉(zhuǎn)型,拿不到
            Person p = (Person) obj;
            return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
        }
        //如果不是person,則直接返回false;總不能拿一個(gè)人跟一個(gè)狗比
        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左邊是對(duì)象,右邊是類;當(dāng)對(duì)象是右邊類或子類所創(chuàng)建對(duì)象時(shí),返回true;否則,返false。

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

相關(guān)文章

  • Java中BigDecimal的舍入模式解析(RoundingMode)

    Java中BigDecimal的舍入模式解析(RoundingMode)

    這篇文章主要介紹了Java中BigDecimal的舍入模式解析(RoundingMode),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 舉例說明Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用

    舉例說明Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中ISP接口隔離原則的使用,接口隔離原則主張一個(gè)類對(duì)另外一個(gè)類的依賴性應(yīng)當(dāng)是建立在最小的接口上,需要的朋友可以參考下
    2016-02-02
  • Redis集群與SSM整合使用方法

    Redis集群與SSM整合使用方法

    這篇文章主要介紹了Redis集群與SSM整合使用方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果

    JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果

    這篇文章主要為大家詳細(xì)介紹了JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Java面試題沖刺第四天--數(shù)據(jù)庫

    Java面試題沖刺第四天--數(shù)據(jù)庫

    這篇文章主要為大家分享了最有價(jià)值的三道數(shù)據(jù)庫面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類

    Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類

    這篇文章主要介紹了Java 如何讀取Excel格式xls、xlsx數(shù)據(jù)工具類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 初始JAVA模塊化開發(fā)的超詳細(xì)步驟(適合菜鳥)

    初始JAVA模塊化開發(fā)的超詳細(xì)步驟(適合菜鳥)

    這篇文章主要介紹了初始JAVA模塊化開發(fā)的超詳細(xì)步驟,詳細(xì)解釋了模塊描述符的職責(zé)、模塊路徑的概念以及如何使用命令行運(yùn)行模塊化Java程序,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽

    Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽

    這篇文章主要介紹了Java常見的幾種基本數(shù)據(jù)結(jié)構(gòu),包括其含義和用法,,需要的朋友可以參考下
    2017-09-09
  • Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理

    這篇文章主要介紹了Java的面向?qū)ο缶幊袒靖拍顚W(xué)習(xí)筆記整理,包括類與方法以及多態(tài)等支持面向?qū)ο笳Z言中的重要特點(diǎn),需要的朋友可以參考下
    2016-01-01
  • springboot整合webservice使用簡單案例總結(jié)

    springboot整合webservice使用簡單案例總結(jié)

    WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語言,平臺(tái)等,可以實(shí)現(xiàn)不同的語言間的相互調(diào)用,下面這篇文章主要給大家介紹了關(guān)于springboot整合webservice使用的相關(guān)資料,需要的朋友可以參考下
    2024-07-07

最新評(píng)論