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

一文搞懂hashCode()和equals()方法的原理

 更新時(shí)間:2020年06月01日 10:13:07   作者:六尺帳篷  
這篇文章主要介紹了詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系,本文先對(duì)兩種方法作了介紹,然后對(duì)二者聯(lián)系進(jìn)行分析,具有一定參考價(jià)值,需要的朋友可以了解下

Java中的超類(lèi)java.lang.Object 有兩個(gè)非常重要的方法:

public boolean equals(Object obj)
public int hashCode()

這兩個(gè)方法最開(kāi)發(fā)者來(lái)說(shuō)是十分重要的,必須清楚的理解,但實(shí)際上,甚至很多經(jīng)驗(yàn)豐富的Java開(kāi)發(fā)者有時(shí)候也沒(méi)有真正搞清楚這兩個(gè)方法的使用和原理。當(dāng)我們自定義了對(duì)象,并且想要將自定義的對(duì)象加到Map中時(shí),我們就必須對(duì)自定義的對(duì)象重寫(xiě)這兩個(gè)方法,才能正確使用Map。我們接下來(lái)將用這篇文章指出在使用hashcode和equals方法時(shí),經(jīng)常范的錯(cuò)誤,并指出如何正確的使用這兩個(gè)方法,以及這兩個(gè)方法工作的原理。

常見(jiàn)的誤區(qū)

看下面這段代碼:

import java.util.HashMap;

public class HashCodeEqual {
  public static void main(String[] args) {
    Apple a1 = new Apple("Blue");
    Apple a2 = new Apple("Green");
    
    HashMap<Apple, Integer> map = new HashMap<>();
    map.put(a1, 10);
    map.put(a2, 20);
    
    System.out.println(map.get(new Apple("Green")));
  }
}

class Apple {
  public String color;
  
  public Apple(String color) {
    this.color = color;
  }
  
  @Override
  public boolean equals(Object obj) {
    if(! (obj instanceof Apple))
      return false;
    if(obj == this)
      return true;
    return this.color.equals(((Apple)obj).color);
  }
}

我們執(zhí)行上面這段代碼

卻發(fā)現(xiàn)與我們預(yù)想的結(jié)果并不一樣,我們想取出map中顏色為Green的apple,最后卻得到一個(gè)null值,這說(shuō)明map沒(méi)有我們需要的顏色為green的apple對(duì)象,但實(shí)際上,我們明明向其中添加了一個(gè)顏色為green的apple對(duì)象,也重寫(xiě)了equals方法,為什么最后卻取不出這個(gè)對(duì)象呢?

![Upload Paste_Image.png failed. Please try again.]

錯(cuò)誤出現(xiàn)的原因

這個(gè)問(wèn)題引起的原因是因?yàn)槲覀儧](méi)有重寫(xiě)“hashCode”方法,這就需要我們深入理解equals方法和hashCode方法的原理:

1 如果兩個(gè)對(duì)象是相等的,那么他們必須擁有一樣的hashcode,這是第一個(gè)前提

2 如果兩個(gè)對(duì)象有一樣的hashcode,但仍不一定相等,因?yàn)檫€需要第二個(gè)要求,也就是equals方法的判斷。

其實(shí),map判斷對(duì)象的方法就是先判斷hashcode是否相等,如果相等再判斷equals方法是否返回true,只有同時(shí)滿足兩個(gè)條件,最后才會(huì)被認(rèn)為是相等的。

Map查找元素比線性搜索更快,這是因?yàn)閙ap利用hashkey去定位元素,這個(gè)定位查找的過(guò)程分成兩步,內(nèi)部原理中,map將對(duì)象存儲(chǔ)在類(lèi)似數(shù)組的數(shù)組的區(qū)域,所以要經(jīng)過(guò)兩個(gè)查找,先找到hashcode相等的,然后在再在其中按線性搜索使用equals方法,通過(guò)這兩部來(lái)查找一個(gè)對(duì)象。

就像上圖這個(gè)結(jié)構(gòu),每個(gè)hashcode對(duì)應(yīng)一個(gè)桶,每個(gè)tongli桶里還有多個(gè)對(duì)象,確定桶的方法是hashCode,在桶中遍歷線性查找的方法是equals。

在Object中的默認(rèn)的hashCode方法的實(shí)現(xiàn)是為不同的對(duì)象返回不同的hashcode,因此如果我們不重寫(xiě)hashcode方法,那么沒(méi)有任何兩個(gè)對(duì)象會(huì)是相等的,因?yàn)閛bject類(lèi)中的hashcode實(shí)現(xiàn)是為不同的對(duì)象返回不同的hashcode。

所以,我們就搞清楚了上一段代碼出錯(cuò)的原因,由于沒(méi)有重寫(xiě)hashcode方法,所有的對(duì)象都是不一樣的,所以我們需要重寫(xiě)hashcode方法,讓顏色的對(duì)象的hashcode是一樣的,比較直接的寫(xiě)法就是直接用color的length作為hashcode。

public int hashCode(){
return this.color.length();
}

** 切記,一定要同時(shí)重寫(xiě)hashCode和equals方法 **

以上就是一文搞懂hashCode()和equals()方法的原理的詳細(xì)內(nèi)容,更多關(guān)于hashCode()和equals()方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式

    使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式

    這篇文章主要介紹了使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Eclipse添加servlet模板過(guò)程代碼詳解

    Eclipse添加servlet模板過(guò)程代碼詳解

    這篇文章主要介紹了Eclipse添加servlet模板過(guò)程代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java contains用法示例

    Java contains用法示例

    這篇文章主要介紹了Java contains的用法示例,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • Java多線程-線程的同步與鎖的問(wèn)題

    Java多線程-線程的同步與鎖的問(wèn)題

    線程的同步是為了防止多個(gè)線程訪問(wèn)一個(gè)數(shù)據(jù)對(duì)象時(shí),對(duì)數(shù)據(jù)造成的破壞。本篇文章主要介紹了Java多線程-線程的同步與鎖的問(wèn)題,有興趣的可以了解一下。
    2016-11-11
  • Java如何自定義異常打印非堆棧信息詳解

    Java如何自定義異常打印非堆棧信息詳解

    這篇文章主要給大家介紹了關(guān)于Java如何自定義異常打印非堆棧信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • CountDownLatch同步工具類(lèi)使用詳解

    CountDownLatch同步工具類(lèi)使用詳解

    這篇文章主要為大家詳細(xì)介紹了CountDownLatch的使用說(shuō)明,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Springboot apollo原理及使用方法詳解

    Springboot apollo原理及使用方法詳解

    這篇文章主要介紹了Springboot apollo原理及使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel

    Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel

    這篇文章主要介紹了Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 一個(gè)處理用戶登陸的servlet簡(jiǎn)單實(shí)例

    一個(gè)處理用戶登陸的servlet簡(jiǎn)單實(shí)例

    這篇文章主要介紹了一個(gè)處理用戶登陸的servlet簡(jiǎn)單實(shí)例,可通過(guò)servlet實(shí)現(xiàn)處理用戶登錄的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說(shuō)明

    Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說(shuō)明

    這篇文章主要介紹了Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

凌海市| 潮州市| 会宁县| 长海县| 东乡县| 龙山县| 仁寿县| 佳木斯市| 亳州市| 通河县| 读书| 阳西县| 齐齐哈尔市| 潼南县| 房产| 周口市| 新郑市| 广平县| 汝城县| 平定县| 连城县| 太仓市| 镇远县| 革吉县| 通江县| 威远县| 凯里市| 清水县| 元阳县| 堆龙德庆县| 宁津县| 砚山县| 老河口市| 宜君县| 汝城县| 商水县| 新化县| 永嘉县| 凤阳县| 九龙城区| 平顺县|