最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

一、equals()方法的理解

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

二、equals()方法的使用

1. 重寫(xiě)equals()方法

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

  • 自反性:對(duì)于任何非null的引用值x,x.equals(x)必須返回true。
  • 對(duì)稱(chēng)性:對(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比較中所用的信息沒(méi)有被修改。
  • 對(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以及類(lèi)型是否匹配
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        // 3. 類(lèi)型匹配,將obj轉(zhuǎn)型為Person類(lèi)型
        Person other = (Person) obj;
        // 4. 比較屬性是否相等
        return age == other.age &&
               (name == null ? other.name == null : name.equals(other.name));
    }

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

2. 使用equals()方法

重寫(xiě)equals()方法后,我們就可以使用它來(lái)比較兩個(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

        // 注意:不要使用 == 來(lái)比較對(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)容是否相等??梢钥吹剑词?code>person1和person2是兩個(gè)不同的對(duì)象,但由于它們的屬性相同,所以person1.equals(person2)返回true。而person1person3的屬性不同,所以person1.equals(person3)返回false。

總結(jié)

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

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

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

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

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

附:重寫(xiě)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;

    //重寫(xiě)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;
        }
        //類(lèi)型判斷
        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ì)象,右邊是類(lèi);當(dāng)對(duì)象是右邊類(lèi)或子類(lèi)所創(chuàng)建對(duì)象時(shí),返回true;否則,返false。

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

相關(guān)文章

  • SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn)

    SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn)

    在SpringBoot項(xiàng)目中,常常會(huì)把代碼文件放入不同的包中,本文主要介紹了SpringBoot中各個(gè)層級(jí)結(jié)構(gòu)的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Java集成Onlyoffice的示例代碼及場(chǎng)景分析

    Java集成Onlyoffice的示例代碼及場(chǎng)景分析

    這篇文章主要介紹了Java集成Onlyoffice的示例代碼及場(chǎng)景分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • Java 中分形圖的幾種方法詳解

    Java 中分形圖的幾種方法詳解

    這篇文章主要介紹了Java 中幾種分形的方法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java如何獲取Cookie和Session

    Java如何獲取Cookie和Session

    Cookie?和?Session之間主要是通過(guò)?SessionId?關(guān)聯(lián)起來(lái)的,?SessionId是?Cookie?和?Session?之間的橋梁,這篇文章主要介紹了Java獲取Cookie和Session的方法,需要的朋友可以參考下
    2024-01-01
  • 一個(gè)簡(jiǎn)陋的java圖書(shū)管理系統(tǒng)

    一個(gè)簡(jiǎn)陋的java圖書(shū)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了一個(gè)簡(jiǎn)陋的java圖書(shū)管理系統(tǒng),簡(jiǎn)單的實(shí)現(xiàn)功能測(cè)試,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Spring MVC整合Kaptcha的具體使用

    Spring MVC整合Kaptcha的具體使用

    Kaptcha 是一個(gè)可高度配置的實(shí)用驗(yàn)證碼生成工具,本文主要介紹了Spring MVC整合Kaptcha的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼

    Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼

    這篇文章主要介紹了Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼,涉及樹(shù)節(jié)點(diǎn)的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Spring Boot緩存問(wèn)題分析及解決方案

    Spring Boot緩存問(wèn)題分析及解決方案

    SpringBoot提供緩存支持,提升應(yīng)用性能,但可能出現(xiàn)緩存不一致、緩存穿透、緩存擊穿等問(wèn)題,分析了緩存基本概念、SpringBoot緩存支持、常見(jiàn)緩存問(wèn)題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • MyBatis Mapper中 @Select注解調(diào)用靜態(tài)常量的問(wèn)題分析

    MyBatis Mapper中 @Select注解調(diào)用靜態(tài)常量的問(wèn)題分析

    在Java編碼中,我們通常會(huì)把這些數(shù)字或者字符串定義在常量類(lèi)或者接口中,可以直接在mapper中也可以使用這些常量就比較好,這篇文章主要介紹了MyBatis Mapper中 @Select注解調(diào)用靜態(tài)常量,需要的朋友可以參考下
    2023-06-06
  • Java點(diǎn)餐小程序之黑心商人

    Java點(diǎn)餐小程序之黑心商人

    這篇文章主要介紹了一個(gè)Java編程的小程序-點(diǎn)餐系統(tǒng),算是對(duì)之前所學(xué)習(xí)的Java基礎(chǔ)知識(shí)作了一個(gè)匯總,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

华坪县| 同江市| 瓦房店市| 台江县| 武宣县| 靖州| 德安县| 东乡县| 河南省| 邵阳县| 福安市| 越西县| 揭东县| 舞钢市| 公主岭市| 绩溪县| 师宗县| 原平市| 东乌| 庆城县| 武鸣县| 黔西| 凤冈县| 从江县| 关岭| 安吉县| 晋州市| 盐亭县| 汪清县| 固始县| 高碑店市| 苗栗市| 淮阳县| 宁南县| 噶尔县| 本溪| 浑源县| 淮滨县| 洪湖市| 惠东县| 麦盖提县|