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

Java中==與equals()及hashcode()三者之間的關(guān)系詳解

 更新時(shí)間:2022年10月13日 09:29:37   作者:懶羊羊.java  
最近也是在讀Hollis的《深入理解Java核心技術(shù)》里面一節(jié)講到了equals()和hashcode()的關(guān)系,對(duì)于這個(gè)高頻面試點(diǎn),咱們需要認(rèn)真理清一下幾者之間的關(guān)系

1.= =

=為賦值運(yùn)算符,==為比較運(yùn)算符,僅比較對(duì)象的內(nèi)存地址,無(wú)法比較真正意義上的相等!

JDK里的equals方法就是通過(guò)==來(lái)實(shí)現(xiàn)的比較對(duì)象的內(nèi)存地址

以Integer為例

Integer a = 127;
Integer b = 127;
System.out.println(a == b);//true
Integer c = 128;
Integer d = 128;
System.out.println(c == d);//false

這里也是通過(guò)== 引出一個(gè)知識(shí)點(diǎn),一個(gè)數(shù)值之差為啥導(dǎo)致結(jié)果不一樣?在[-128,127]的區(qū)間內(nèi)Integer a = 127;由于設(shè)計(jì)了緩存,而后的Integer b = 127;就是直接利用的緩存里的數(shù)值對(duì)象,所以通過(guò)==比較的結(jié)果為true,因?yàn)樗麄儽举|(zhì)還是一個(gè)數(shù)值對(duì)象

而Integer c = 128;Integer d = 128;就沒(méi)這樣幸運(yùn)了,超過(guò)了緩存區(qū)間會(huì)重新new出對(duì)象,以至于兩者雖然數(shù)值相同但是地址不同

所以啊,==比較的是地址!也只是地址!

在前面==的基礎(chǔ)上,再來(lái)看equals()

2.equals()

以一個(gè)String類型的變量為例,當(dāng)我們來(lái)使用equals()比較兩個(gè)對(duì)象時(shí),結(jié)果肯定是false,因?yàn)閑quals()方法比較的是內(nèi)存地址,這里的person1,person2均是兩次new出來(lái)的,所以地址肯定是不相同的,而person1,person3指向同一空間地址一定是相同的

Person person1 = new Person("lyy");
Person person2 = new Person("lyy");
Person person3 = person1;
System.out.println(person1.equals(person2));//false	
System.out.println(person1.equals(person3));//true

在不重寫(xiě)的情況下,我們Ctrl+B看一下equals()的源碼:

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

顯而易見(jiàn)的是 (this = = obj)是該方法的核心,而 = = 又是兩個(gè)對(duì)象比較的方式,= = 嘛比的是內(nèi)存地址,懂的都懂噢

3.重寫(xiě)equals()

記不記得你在刷面經(jīng)或者短視頻的時(shí)候經(jīng)??吹降囊痪湓?mdash;—比較兩個(gè)對(duì)象的內(nèi)容是否相等時(shí)我們要重寫(xiě)equals()方法!

這是為何?那我們不妨來(lái)重寫(xiě)一下equals()試試水

@Override
public boolean equals(Object obj){
    if (this==obj){
        return true;
    }
    if (obj==null||getClass()!= obj.getClass()){
        return false;
    }
 Person person=(Person)obj;
    return Objects.equals(name,person.name);
}

重寫(xiě)過(guò)equals后,原有的兩者就已發(fā)生翻天覆地的變化,從原來(lái)的比較內(nèi)存地址——>比較對(duì)象內(nèi)容,這是一件很神奇的事情,因?yàn)閷?shí)現(xiàn)了比較不同對(duì)象的相同或者不同內(nèi)容!

重寫(xiě)之后:

具體是如何實(shí)現(xiàn)的呢?就像下面這樣…

4.equals()比較流程

下面我們來(lái)探索一下重寫(xiě)的equals()是如何比較內(nèi)容的:

通過(guò)debug來(lái)深入理解一下

下面來(lái)看一下debug過(guò)程中變量情況

總的來(lái)說(shuō),通過(guò)debug,重寫(xiě)equals()來(lái)比較不同變量的不同或者相同內(nèi)容得到了進(jìn)一步論證!

5.hashcode()

我們?cè)贗DEA中通過(guò)CTRL+O的快捷鍵重寫(xiě)hashcode()時(shí)它上面所屬的類是誰(shuí)?

java.lang.Object!

顯而易見(jiàn),該方法是Object類所定義的方法,作用是返回對(duì)象的哈希值返回值的類型為int(哈希值的作用是確定該對(duì)象在哈希表中的位置),曾經(jīng)有這樣一句流川千古的話:你必須在每個(gè)重寫(xiě)equals()的類中重寫(xiě)一遍hashcode()方法

如果不這樣做將會(huì)違反Object.hashcode()的一般約定,這會(huì)阻止lei與所有基于散列的集合(比如hashmap,hashset…)一起正常工作。為啥?因?yàn)閔ashmap,hashset等基于散列的集合中,會(huì)使用對(duì)象的hashcode值來(lái)確定該對(duì)象應(yīng)該如何存儲(chǔ)到集合中,并且再次使用hashcode來(lái)定位對(duì)象在集合中的位置

那么

在一個(gè)類中重寫(xiě)了equals()但沒(méi)重寫(xiě)hashcode()會(huì)出現(xiàn)啥情況呢?

我們來(lái)通過(guò)一個(gè)例子試試水~

嘗試把對(duì)象都放入一個(gè)不能重復(fù)的set里,然后看集合的長(zhǎng)度來(lái)判斷兩個(gè)對(duì)象是否相等!

public class equals_hashcode {
    public static void main(String[] args) {
        Person person1 = new Person("lyy");
        Person person2 = new Person("lyy");
        HashSet<Person> set = new HashSet<>();
        set.add(person1);
        set.add(person2);
        System.out.println(set.size());
    }
}
class Person {
    public String name;
    public Person(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return Objects.equals(name, person.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

情況一:

當(dāng)只重寫(xiě)了equals()方法時(shí)運(yùn)行的結(jié)果為2,由此得出兩個(gè)對(duì)象不相等!

情況二:

當(dāng)既重寫(xiě)了equals()和hashcode()后運(yùn)行結(jié)果為1,所以兩個(gè)對(duì)象相等!

由此得出,對(duì)象相等的本質(zhì)是:

1.地址相同

2.哈希值相同(重寫(xiě)hashcode的體現(xiàn))

這也不難聯(lián)系到之前的約定了,在比較對(duì)象是否相等的場(chǎng)景下,我們必須重寫(xiě)equals()和hashcode()!

對(duì)象相等建立在==之上,equals(),hashcode()的雙重寫(xiě)是對(duì)象相等的基本準(zhǔn)則!

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

相關(guān)文章

  • SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸

    SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸

    這篇文章主要介紹了SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java實(shí)現(xiàn)手寫(xiě)一個(gè)簡(jiǎn)單版的線程池

    java實(shí)現(xiàn)手寫(xiě)一個(gè)簡(jiǎn)單版的線程池

    有些人可能對(duì)線程池比較陌生,并且更不熟悉線程池的工作原理。本文就來(lái)手寫(xiě)一個(gè)簡(jiǎn)單版的線程池,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java實(shí)現(xiàn)頁(yè)面多查詢條件必選的統(tǒng)一處理思路

    java實(shí)現(xiàn)頁(yè)面多查詢條件必選的統(tǒng)一處理思路

    這篇文章主要為大家介紹了java實(shí)現(xiàn)頁(yè)面多查詢條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • java后端如何實(shí)現(xiàn)防止接口重復(fù)提交

    java后端如何實(shí)現(xiàn)防止接口重復(fù)提交

    這篇文章主要介紹了java后端如何實(shí)現(xiàn)防止接口重復(fù)提交問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java編程使用UDP建立群聊系統(tǒng)代碼實(shí)例

    Java編程使用UDP建立群聊系統(tǒng)代碼實(shí)例

    這篇文章主要介紹了Java編程使用UDP建立群聊系統(tǒng)代碼實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2018-01-01
  • 從Java到JSON一起探索Jackson的魔力

    從Java到JSON一起探索Jackson的魔力

    Jackson是一個(gè)用于處理JSON數(shù)據(jù)的開(kāi)源Java庫(kù),這篇文章主要為大家介紹了Java是如何利用Jackson處理JSON數(shù)據(jù)的,感興趣的小伙伴可以了解一下
    2023-05-05
  • JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼詳解

    JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼詳解

    Feign是一個(gè)聲明式的Web Service客戶端,是一種聲明式、模板化的HTTP客戶端。而OpenFeign是Spring Cloud 在Feign的基礎(chǔ)上支持了Spring MVC的注解,如@RequesMapping等等,這篇文章主要給大家介紹了關(guān)于JWT在OpenFeign調(diào)用中進(jìn)行令牌中繼的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java面試題之基本語(yǔ)法(圖解)

    Java面試題之基本語(yǔ)法(圖解)

    這篇文章主要介紹了關(guān)于Java面試題之基本語(yǔ)法的相關(guān)資料,文中通過(guò)圖片說(shuō)明介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。
    2017-02-02
  • Java實(shí)現(xiàn)京東聯(lián)盟API數(shù)據(jù)獲取功能

    Java實(shí)現(xiàn)京東聯(lián)盟API數(shù)據(jù)獲取功能

    這篇文章介紹了Java獲取京東聯(lián)盟API數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 基于Java中throw和throws的區(qū)別(詳解)

    基于Java中throw和throws的區(qū)別(詳解)

    下面小編就為大家?guī)?lái)一篇基于Java中throw和throws的區(qū)別(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論

阳江市| 微山县| 三台县| 安岳县| 高唐县| 册亨县| 德江县| 鄯善县| 旺苍县| 泌阳县| 库车县| 石林| 临湘市| 保定市| 绥德县| 施秉县| 古交市| 新津县| 太白县| 克东县| 铜川市| 仙桃市| 盐山县| 穆棱市| 马龙县| 长宁区| 宜宾市| 政和县| 朝阳区| 乌鲁木齐县| 合山市| 鄯善县| 曲阳县| 佛学| 清水河县| 呼玛县| 通州市| 铁力市| 安陆市| 同江市| 吉木乃县|