中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

詳解hashCode()和equals()

發布時間:2020-07-20 14:14:55 來源:億速云 閱讀:128 作者:小豬 欄目:編程語言

小編這次要給大家分享的是詳解hashCode()和equals(),文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

Java中的超類java.lang.Object 有兩個非常重要的方法:

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

這兩個方法最開發者來說是十分重要的,必須清楚的理解,但實際上,甚至很多經驗豐富的Java開發者有時候也沒有真正搞清楚這兩個方法的使用和原理。當我們自定義了對象,并且想要將自定義的對象加到Map中時,我們就必須對自定義的對象重寫這兩個方法,才能正確使用Map。我們接下來將用這篇文章指出在使用hashcode和equals方法時,經常范的錯誤,并指出如何正確的使用這兩個方法,以及這兩個方法工作的原理。

常見的誤區

看下面這段代碼:

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

我們執行上面這段代碼

詳解hashCode()和equals()

卻發現與我們預想的結果并不一樣,我們想取出map中顏色為Green的apple,最后卻得到一個null值,這說明map沒有我們需要的顏色為green的apple對象,但實際上,我們明明向其中添加了一個顏色為green的apple對象,也重寫了equals方法,為什么最后卻取不出這個對象呢?

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

錯誤出現的原因

這個問題引起的原因是因為我們沒有重寫“hashCode”方法,這就需要我們深入理解equals方法和hashCode方法的原理:

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

2 如果兩個對象有一樣的hashcode,但仍不一定相等,因為還需要第二個要求,也就是equals方法的判斷。

其實,map判斷對象的方法就是先判斷hashcode是否相等,如果相等再判斷equals方法是否返回true,只有同時滿足兩個條件,最后才會被認為是相等的。

Map查找元素比線性搜索更快,這是因為map利用hashkey去定位元素,這個定位查找的過程分成兩步,內部原理中,map將對象存儲在類似數組的數組的區域,所以要經過兩個查找,先找到hashcode相等的,然后在再在其中按線性搜索使用equals方法,通過這兩部來查找一個對象。

詳解hashCode()和equals()

就像上圖這個結構,每個hashcode對應一個桶,每個tongli桶里還有多個對象,確定桶的方法是hashCode,在桶中遍歷線性查找的方法是equals。

在Object中的默認的hashCode方法的實現是為不同的對象返回不同的hashcode,因此如果我們不重寫hashcode方法,那么沒有任何兩個對象會是相等的,因為object類中的hashcode實現是為不同的對象返回不同的hashcode。

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

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

詳解hashCode()和equals()

** 切記,一定要同時重寫hashCode和equals方法 **

看完這篇關于詳解hashCode()和equals()的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

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

AI

德安县| 同江市| 光山县| 清镇市| 祁阳县| 双桥区| 咸丰县| 宜春市| 驻马店市| 庆元县| 定州市| 大名县| 色达县| 辉县市| 乾安县| 泸西县| 通辽市| 全州县| 新和县| 玉环县| 金昌市| 宿州市| 炉霍县| 乃东县| 保定市| 黄梅县| 柳州市| 会理县| 中牟县| 云安县| 永顺县| 平阳县| 乐清市| 科技| 平罗县| 灵武市| 大渡口区| 溧水县| 馆陶县| 安仁县| 黄山市|