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

關(guān)于Object中equals方法和hashCode方法判斷的分析

 更新時間:2019年01月16日 08:32:47   作者:Haozz_1994  
今天小編就為大家分享一篇關(guān)于關(guān)于Object中equals方法和hashCode方法判斷的分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

首先提出這樣一個問題:

如果兩個對象不相同,他們的hashCode值一定不相等嗎?

我們都知道equals和hashCode是Object中的方法,java中每一個對象都具有這兩個方法。

  • equals(Object obj):判斷兩個對象是否“相同”,返回true或false;
public boolean equals(Object obj) {
    return (this == obj);
}
  • hashCode():將該對象的內(nèi)部地址作為一個int值返回
public native int hashCode();

再來看兩條關(guān)于這兩個方法的規(guī)范:

  1. 如果重寫equals(Object obj)方法,有必要重寫hashCode()方法,以確保equals(Object obj)方法返回為true的兩個對象有相等的hashCode()返回值。也就是說,如果兩個對象相同,他們的hashCode值應(yīng)該相等;
  2. 如果equals(Object obj)方法返回false,即兩個對象不“相同”,并不要求這兩個對象調(diào)用hashCode()方法有不相等的返回值。也就是說,如果兩個對象不相同,他們的hashCode可能相等。

當(dāng)然,上述只是規(guī)范。針對規(guī)范1,如果重寫equals(Object obj)返回true,而hashCode()方法返回不相等的值,也是可以編譯過的。

這樣我們可以作出如下推論:

  1. 如果兩個對象equals,理論上講他們的hashCode一定相等(至少Java環(huán)境會這樣認(rèn)為);
  2. 如果兩個對象不equals,他們的hashCode有可能相等;
  3. 如果兩個對象hashCode相等,他們不一定equals;
  4. 如果兩個對象hashCode不相等,他們一定不equals。

看著有點(diǎn)繞,其實(shí)原理很簡單。我們從推論3和推論4可以預(yù)測:

Java在判斷兩個對象是否“相同”時,首先判斷他們的hashCode()方法是否返回相等的int值,其次判斷equals方法是否返回true。

我們可以寫一段簡單的代碼測試一下:

首先寫一個Java類:

public class Person {
  //重寫equals方法,始終返回false;
  @Override
  public boolean equals(Object obj) {
    System.out.println("判斷Person的equals");
    return false;
  }
  //重寫hashCode方法,始終返回1;
  @Override
  public int hashCode() {
    System.out.println("判斷Person的hashCode");
    return 1;
  }
}

上述代碼中Person類重寫了equals方法,打印并始終返回false,重寫了hashCode方法,打印并始終返回1。

我們都知道Map中要求鍵不能重復(fù),也就是不能“相同”,所以可以寫如下的測試類:

public class TestPerson {
  @Test
  public void test(){
    Map<Person,Object> map = new HashMap<>();
    map.put(new Person(),new Object());//放入第1個Person-Object鍵值對;
    System.out.println("=====================");
    map.put(new Person(),new Object());//放入第2個Person-Object鍵值對;
    System.out.println(map.size());
  }
}

運(yùn)行,打印結(jié)果如下

判斷Person的hashCode
=====================
判斷Person的hashCode
判斷Person的equals
2

我們來分析一下:

  1. 當(dāng)放入第1個Person-Object鍵值對時,Java會判斷map中有沒有和當(dāng)前添加的new Person()相同的對象,于是去調(diào)用了Person的hashCode()方法,得到返回值1,發(fā)現(xiàn)此時map中沒有相等的hashCode為1的Person對象(因?yàn)榇藭rmap為空),所以不再判斷equals方法,將這個鍵值對放入map中;(推論4:如果兩個對象hashCode不相等,他們一定不equals)
  2. 當(dāng)放入第2個Person-Object鍵值對時,Java依然采用相同的判斷方式,hashCode()方法判斷之后得到返回值為1,發(fā)現(xiàn)此時map中有相等的hashCode值的Person對象,然后再去判斷equals方法,得到返回值false(推論3:如果兩個對象的hashCode相等,他們不一定equals),認(rèn)為這兩個對象不相同,于是將第2個鍵值對也放入map中。執(zhí)行之后得到map的size為2

所以可以得出結(jié)論:

Java在判斷兩個對象是否“相同”時,首先判斷他們的hashCode()方法是否返回相等的int值,如果不相等則直接認(rèn)為他們不“相同”,如果相等,再判斷equals方法是否返回true。

針對上述代碼,可以在equals方法和hashCode方法中分別打斷點(diǎn),Debug運(yùn)行,這樣會看得比較清楚一點(diǎn)。

我們回到最初的那個問題:如果兩個對象不相同,他們的hashCode值一定不相等嗎?

上述代碼中的場景就充分說明兩個對象不相同時hashCode值卻相等的場景,當(dāng)然,這是不按照規(guī)范操作的情況。所以寫代碼時一定要按照規(guī)范要求的去做,避免不必要的BUG

可以試想一下,如果將上述代碼中重寫equals方法中的始終返回false改為始終返回true,又會是怎樣的結(jié)果。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Java中MyBatis的結(jié)果映射詳解

    Java中MyBatis的結(jié)果映射詳解

    這篇文章主要介紹了Java中MyBatis的結(jié)果映射詳解,MyBatis 支持對各種單表查詢、關(guān)聯(lián)查詢等各種復(fù)雜查詢的結(jié)果進(jìn)行映射,MyBatis 是一款優(yōu)秀的持久層框架,它的強(qiáng)大之處正是 SQL 語句映射,這一章介紹常用的結(jié)果映射,需要的朋友可以參考下
    2023-08-08
  • spring中12種@Transactional的失效場景(小結(jié))

    spring中12種@Transactional的失效場景(小結(jié))

    日常我們進(jìn)行業(yè)務(wù)開發(fā)時,基本上使用的都是聲明式事務(wù),即為使用@Transactional注解的方式,本文主要介紹了spring中12種@Transactional的失效場景,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 關(guān)于maven打包出錯的解決方案

    關(guān)于maven打包出錯的解決方案

    這篇文章主要介紹了關(guān)于maven打包出錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java中的內(nèi)存模型JMM詳細(xì)解讀

    Java中的內(nèi)存模型JMM詳細(xì)解讀

    這篇文章主要介紹了Java中的內(nèi)存模型JMM詳細(xì)解讀,Java?對內(nèi)存的抽象模型如下,每個線程都有一塊自己的私有內(nèi)存(也稱為工作內(nèi)存),當(dāng)線程使用變量時,會把主內(nèi)存里面的變量復(fù)制到工作內(nèi)存,線程讀寫變量時操作的是自己工作內(nèi)存中的變量,需要的朋友可以參考下
    2023-12-12
  • 全面剖析java中的注解(Annotation)

    全面剖析java中的注解(Annotation)

    一個詞就可以描述注解,那就是元數(shù)據(jù),即一種描述數(shù)據(jù)的數(shù)據(jù)。所以,可以說注解就是源代碼的元數(shù)據(jù)。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 如何使用Spring Batch進(jìn)行批處理任務(wù)管理

    如何使用Spring Batch進(jìn)行批處理任務(wù)管理

    本文介紹了如何配置Spring Batch、如何創(chuàng)建批處理任務(wù),以及如何讀取和寫入數(shù)據(jù),希望通過本文的介紹,你能更好地理解和使用Spring Batch來管理批處理任務(wù),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機(jī)制

    全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機(jī)制

    這篇文章主要介紹了全面解析Hibernate關(guān)聯(lián)操作、查詢操作、高級特性、并發(fā)處理機(jī)制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • maven加入spring框架的詳細(xì)教程

    maven加入spring框架的詳細(xì)教程

    這篇文章主要介紹了maven加入spring框架的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • AsyncConfigurerSupport自定義異步線程池處理異常

    AsyncConfigurerSupport自定義異步線程池處理異常

    這篇文章主要為大家介紹了AsyncConfigurerSupport自定義異步線程池處理異常詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    這篇文章主要介紹了Java的Hibernate框架中的緩存和延遲加載機(jī)制,Hibernate是注明的Java下SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11

最新評論

崇信县| 河源市| 宁波市| 辛集市| 雷山县| 泊头市| 集安市| 汉阴县| 集安市| 冕宁县| 新蔡县| 云安县| 郧西县| 吉木乃县| 长治市| 民乐县| 宜丰县| 平潭县| 南昌市| 论坛| 安化县| 西乌珠穆沁旗| 民乐县| 宜昌市| 尉犁县| 宁陵县| 隆昌县| 深水埗区| 兴山县| 怀柔区| 定南县| 灵武市| 安塞县| 清流县| 勃利县| 广东省| 广丰县| 东光县| 金昌市| 长寿区| 禄丰县|