溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Object中如何判斷equals和hashCode方法

發布時間:2021-08-02 14:54:26 來源:億速云 閱讀:118 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關Object中如何判斷equals和hashCode方法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

首先提出這樣一個問題:

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

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

  • equals(Object obj):判斷兩個對象是否“相同”,返回true或false;

public boolean equals(Object obj) {
    return (this == obj);
}
  • hashCode():將該對象的內部地址作為一個int值返回

public native int hashCode();

再來看兩條關于這兩個方法的規范:

  1. 如果重寫equals(Object obj)方法,有必要重寫hashCode()方法,以確保equals(Object obj)方法返回為true的兩個對象有相等的hashCode()返回值。也就是說,如果兩個對象相同,他們的hashCode值應該相等;

  2. 如果equals(Object obj)方法返回false,即兩個對象不“相同”,并不要求這兩個對象調用hashCode()方法有不相等的返回值。也就是說,如果兩個對象不相同,他們的hashCode可能相等。

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

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

  1. 如果兩個對象equals,理論上講他們的hashCode一定相等(至少Java環境會這樣認為);

  2. 如果兩個對象不equals,他們的hashCode有可能相等;

  3. 如果兩個對象hashCode相等,他們不一定equals;

  4. 如果兩個對象hashCode不相等,他們一定不equals。

看著有點繞,其實原理很簡單。我們從推論3和推論4可以預測:

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中要求鍵不能重復,也就是不能“相同”,所以可以寫如下的測試類:

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());
  }
}

運行,打印結果如下

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

我們來分析一下:

  1. 當放入第1個Person-Object鍵值對時,Java會判斷map中有沒有和當前添加的new Person()相同的對象,于是去調用了Person的hashCode()方法,得到返回值1,發現此時map中沒有相等的hashCode為1的Person對象(因為此時map為空),所以不再判斷equals方法,將這個鍵值對放入map中;(推論4:如果兩個對象hashCode不相等,他們一定不equals)

  2. 當放入第2個Person-Object鍵值對時,Java依然采用相同的判斷方式,hashCode()方法判斷之后得到返回值為1,發現此時map中有相等的hashCode值的Person對象,然后再去判斷equals方法,得到返回值false(推論3:如果兩個對象的hashCode相等,他們不一定equals),認為這兩個對象不相同,于是將第2個鍵值對也放入map中。執行之后得到map的size為2

所以可以得出結論:

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

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

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

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

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

關于Object中如何判斷equals和hashCode方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女