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

Java中equals比較方法使用詳解

 更新時(shí)間:2023年12月12日 09:57:17   作者:zues~  
這篇文章主要給大家介紹了關(guān)于Java中equals比較方法使用的相關(guān)資料,在Java中equals()方法是Object類的一個(gè)實(shí)例方法,用于比較兩個(gè)對象是否相等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1、equals方法的背景

在Java中,equals方法是Object類的一個(gè)方法,用于比較兩個(gè)對象是否相等。

Java中有兩種比較對象的方法:==運(yùn)算符和equals方法。

==運(yùn)算符用于比較兩個(gè)對象的引用,如果它們指向的是同一個(gè)對象,則返回true;而equals方法用于比較兩個(gè)對象的內(nèi)容是否相等,當(dāng)它們的內(nèi)容相等時(shí),則返回true。因此,equals方法可以用于比較兩個(gè)值相同的字符串、整型等基本數(shù)據(jù)類型,或需要通過內(nèi)容比較才能確定相等的自定義類對象等。

2、equals方法的使用

如何覆蓋equals方法

在Java中,一個(gè)類如果想要正確地使用equals方法,一定要對該方法進(jìn)行覆蓋。覆蓋equals方法的意思是,將equals方法從Object類中繼承來的實(shí)現(xiàn)替換為自己的實(shí)現(xiàn)。如果不覆蓋equals方法,則調(diào)用該方法時(shí)會使用繼承的Object類的實(shí)現(xiàn),這種默認(rèn)實(shí)現(xiàn)無法提供正確的比較行為,因?yàn)樗鼰o法知道哪些屬性或狀態(tài)在兩個(gè)對象中是必須相同的。

因此,覆蓋equals方法的必要性在于提供一個(gè)自定義的比較行為,使得該方法可以正確地比較自定義類對象的內(nèi)容是否相同。而覆蓋equals方法的步驟如下:

1)確定對象相等的條件;

2)覆蓋equals方法,實(shí)現(xiàn)對象相等的比較邏輯;

3)同時(shí)覆蓋hashCode方法,確保相等的對象具有相等的hashCode值。

equals方法的實(shí)現(xiàn)

在重寫equals方法時(shí)應(yīng)該遵循以下的通用標(biāo)準(zhǔn):

1)自反性:對于任何非null的引用值x,x.equals(x)應(yīng)該返回true;

2)對稱性:對于任何非null的引用值x和y,如果x.equals(y)返回true,則y.equals(x)也應(yīng)該返回true;

3)傳遞性:對于任何非null的引用值x、y和z,如果x.equals(y)返回true,y.equals(z)也返回true,那么x.equals(z)也應(yīng)該返回true;

4)一致性:對于任何非null的引用值x和y,如果用于equals比較的對象信息沒有發(fā)生變化,那么無論進(jìn)行多少次比較,都應(yīng)該返回true或false;

5)非空性:對于任何非null的引用值x,x.equals(null)應(yīng)該返回false。

下面是一個(gè)重寫equals方法的例子,假設(shè)我們有一個(gè)自定義的EqualsDemo類:

public class EqualsDemo {
    private String name;
    private int age;
    private double salary;

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

    // 重寫equals方法
    public boolean equals(Object obj) {
        if (obj == this) {  // 如果是同一對象,返回true
            return true;
        }
        if (!(obj instanceof EqualsDemo)) {  // 如果obj不是Employee類對象,返回false
            return false;
        }
        EqualsDemo equalsDemo = (EqualsDemo)obj;  // 強(qiáng)制轉(zhuǎn)換為Employee類對象
        return equalsDemo.name.equals(this.name) && equalsDemo.age == this.age && equalsDemo.salary == this.salary;
    }

    // 重寫hashCode方法
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        long temp = Double.doubleToLongBits(salary);
        result = 31 * result + (int)(temp ^ (temp >>> 32));
        return result;
    }
}

在這個(gè)例子中,EqualsDemo類重寫了equals方法,比較了該類的三個(gè)屬性:name,age和salary。如果兩個(gè)EqualsDemo對象的這三個(gè)屬性都相等,則這兩個(gè)EqualsDemo對象相等。同時(shí),EqualsDemo類也重寫了hashCode方法,根據(jù)該類的屬性計(jì)算了hashCode值。

3、equals方法的使用注意事項(xiàng)

在使用equals方法時(shí),需要遵循以下注意事項(xiàng):

1)永遠(yuǎn)不要使用equals方法比較對象的類型。如果沒有覆蓋equals方法,則Object.equals(Object obj)只有在obj和本身引用同一個(gè)對象時(shí)才返回true;如果覆蓋了equals方法,則equals(Object obj)所接收的參數(shù)類型必須與本身的類型相同或可以強(qiáng)制轉(zhuǎn)換成本身類型。

2)永遠(yuǎn)不要使用equals方法比較字符串常量。在Java中,字符串常量是共享的,如果用equals方法比較兩個(gè)字符串常量,可能會導(dǎo)致不正確的結(jié)果。

3)永遠(yuǎn)不要使用equals方法比較兩個(gè)浮點(diǎn)型或雙精度型的值。由于浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部只能表示近似值,所以可能會導(dǎo)致不正確的結(jié)果。

4、equals方法的相關(guān)問題

1. equals方法與“==”有何區(qū)別?

在Java中,==運(yùn)算符和equals方法都可以用于比較兩個(gè)對象。它們之間的區(qū)別在于:

==運(yùn)算符用于比較兩個(gè)對象的引用,如果它們指向的是同一個(gè)對象,則返回true;

equals方法用于比較兩個(gè)對象的內(nèi)容是否相等,當(dāng)它們的內(nèi)容相等時(shí),則返回true。

例如:

Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b); //false
System.out.println(a.equals(b)); //true

在這個(gè)例子中,a和b是兩個(gè)不同的Integer對象,雖然它們的值相同,但是它們指向的是不同的對象,因此使用==運(yùn)算符比較時(shí)返回false。但是,因?yàn)樗鼈兊闹迪嗤?,使用equals方法比較時(shí)返回true。

2.equals方法與hashCode方法有何聯(lián)系?

在Java中,每個(gè)對象都有一個(gè)默認(rèn)的hashCode值,該值是一種與該對象有關(guān)的整數(shù),并且具有以下特性:

1)如果兩個(gè)對象相等,則它們的hashCode值一定相等;

2)如果兩個(gè)對象的hashCode值相等,則它們不一定相等。

因此,在覆蓋equals方法時(shí),必須同時(shí)覆蓋hashCode方法,以保證相等的對象具有相等的hashCode值。hashCode方法返回的值應(yīng)該根據(jù)equals方法比較的對象信息計(jì)算得出,具體實(shí)現(xiàn)方式可以借鑒上面的例子。

3. equal方法的效率問題

在Java中,equals方法的執(zhí)行效率可能會受到多種因素的影響,例如equals方法的實(shí)現(xiàn)邏輯、對象屬性的數(shù)量和類型等。因此,在比較大規(guī)模的對象時(shí),equals方法的效率可能會顯著降低。

為了提高equals方法的執(zhí)行效率,可以考慮以下幾種方法:

1)先比較兩個(gè)對象的hashCode值,如果它們的hashCode值不同,則這兩個(gè)對象不相等,可以直接返回false;

2)將equals方法的比較順序調(diào)整,將屬性值變化頻率低的屬性放在前面比較;

3)使用緩存,將對象的hashCode值緩存起來,避免重復(fù)計(jì)算。

補(bǔ)充知識:重寫equals方法練習(xí)

package object;
/*
判斷兩個(gè)person對象的內(nèi)容是否相等
如果兩個(gè)person對象的各個(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è)對象是同一個(gè)對象,則直接返回true
        if (this == obj){   //this就代表調(diào)用equals方法的那個(gè)對象,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左邊是對象,右邊是類;當(dāng)對象是右邊類或子類所創(chuàng)建對象時(shí),返回true;否則,返false。

總結(jié) 

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

相關(guān)文章

  • Java中接收鍵盤輸入的三種方法

    Java中接收鍵盤輸入的三種方法

    這篇文章主要介紹了Java中接收鍵盤輸入的三種方法,本文給出3個(gè)方法實(shí)現(xiàn)通過讀取控制臺的輸入與用戶實(shí)現(xiàn)交互,需要的朋友可以參考下
    2015-06-06
  • SpringBoot超詳細(xì)講解事務(wù)管理

    SpringBoot超詳細(xì)講解事務(wù)管理

    事務(wù)的作用就是為了保證用戶的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就 回退到事務(wù)開始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們在使用Spring Boot開發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)
    2022-08-08
  • SpringMvc配置靜態(tài)資源訪問路徑的實(shí)現(xiàn)

    SpringMvc配置靜態(tài)資源訪問路徑的實(shí)現(xiàn)

    本文主要介紹了SpringMvc配置靜態(tài)資源訪問路徑的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java中的HashMap集合深度解析

    Java中的HashMap集合深度解析

    這篇文章主要介紹了Java中的HashMap集合深度解析, HashMap可以說是Java中最常用的集合類框架之一,是Java語言中非常典型的數(shù)據(jù)結(jié)構(gòu),我們總會在不經(jīng)意間用到它,很大程度上方便了我們?nèi)粘i_發(fā),需要的朋友可以參考下
    2023-09-09
  • SpringBoot項(xiàng)目中Redis存儲Session對象序列化處理

    SpringBoot項(xiàng)目中Redis存儲Session對象序列化處理

    在 Spring Boot 項(xiàng)目中使用 Redis 存儲 Session 時(shí),對象的序列化和反序列化是關(guān)鍵步驟,下面我們就來講講如何在 Spring Boot 項(xiàng)目中處理 Redis 存儲 Session 對象的序列化和反序列化吧
    2025-05-05
  • 解決SpringCloud Gateway配置自定義路由404的坑

    解決SpringCloud Gateway配置自定義路由404的坑

    這篇文章主要介紹了解決SpringCloud Gateway配置自定義路由404的坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot創(chuàng)建多module項(xiàng)目的實(shí)例

    springboot創(chuàng)建多module項(xiàng)目的實(shí)例

    這篇文章主要介紹了springboot創(chuàng)建多module項(xiàng)目的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot2.0.3打印默認(rèn)數(shù)據(jù)源為 HikariDataSource (null)問題

    SpringBoot2.0.3打印默認(rèn)數(shù)據(jù)源為 HikariDataSource (null)問題

    這篇文章主要介紹了SpringBoot2.0.3打印默認(rèn)數(shù)據(jù)源為 HikariDataSource (null)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java for循環(huán)常見優(yōu)化方法案例詳解

    Java for循環(huán)常見優(yōu)化方法案例詳解

    這篇文章主要介紹了Java for循環(huán)常見優(yōu)化方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解Java如何實(shí)現(xiàn)一個(gè)優(yōu)秀的散列表

    詳解Java如何實(shí)現(xiàn)一個(gè)優(yōu)秀的散列表

    這篇文章主要通過簡單的示例為大家詳細(xì)介紹了在Java中如何實(shí)現(xiàn)一個(gè)優(yōu)秀的散列表,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下
    2023-07-07

最新評論

宜都市| 八宿县| 饶平县| 郸城县| 科技| 普陀区| 弥勒县| 会宁县| 遂川县| 福海县| 收藏| 忻州市| 阿拉善盟| 江阴市| 汪清县| 伽师县| 青河县| 重庆市| 镇巴县| 商南县| 安岳县| 顺昌县| 太原市| 精河县| 长白| 锦屏县| 施秉县| 吉林市| 湟中县| 凤庆县| 成武县| 凤山市| 永嘉县| 桃园市| 南漳县| 赤城县| 湖北省| 天津市| 泰来县| 江永县| 蓝田县|