精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

重寫Equals方法為什么通常會重寫Hashcode方法?

開發 前端
最近在面試的時候,當問完了HashMap的數據結構之后,通常會再多問一個問題,就是:重寫equals方法時通常為什么也要重寫一下hashcode方法?

[[388535]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。  

最近在面試的時候,當問完了HashMap的數據結構之后,通常會再多問一個問題,就是:重寫equals方法時通常為什么也要重寫一下hashcode方法?

其實這個問題,本質上又回到HashMap的應用場景了,就是想看一下面試者是否真的融會貫通。今天這篇文章就帶大家了解一下equals方法和hashcode方法之間的關系,以及相關的知識點。

equals與hashcode的存在

其實每個類都有一個equals方法和hashcode方法。因為所有的類都繼承自Object類。Object類中定義如下:

  1. public boolean equals(Object obj) { 
  2.     return (this == obj); 
  3.      
  4. public native int hashCode(); 

直觀上可以看到equals方法默認比較的是對象的引用,直接用“==”進行比較。而hashCode方法是一個native方法,返回值為整型。

而這兩個方法都未被final修飾,都是可以進行重寫的。

對于我們經常使用的比如String 、Math、Integer、Double等類,都進行了equals()和hashCode()方法的重寫。

equals()方法

equals()方法是用來判斷兩個對象是否相等。Object默認實現了equals方法,但很明顯不太符合個性化的需求,因此往往需要進行重寫。比如常用的String類,重寫的equals方法如下:

  1. // 重寫equals方法 
  2. public boolean equals(Object anObject) { 
  3.     if (this == anObject) { 
  4.         return true
  5.     } 
  6.     if (anObject instanceof String) { 
  7.         String anotherString = (String)anObject; 
  8.         int n = value.length; 
  9.         if (n == anotherString.value.length) { 
  10.             char v1[] = value; 
  11.             char v2[] = anotherString.value; 
  12.             int i = 0; 
  13.             while (n-- != 0) { 
  14.                 if (v1[i] != v2[i]) 
  15.                     return false
  16.                 i++; 
  17.             } 
  18.             return true
  19.         } 
  20.     } 
  21.     return false

這里的比較已不再是單純的地址比較了。首先通過地址進行比較,如果地址相同那么肯定是相同的對象。如果地址不同就再拿char數組的內容進行比較,完全相等則返回true。

equals()方法的特質

在Object類的equals方法上有注釋說明了equals()方法需滿足的一些特性:

  • 自反性(reflexive)。對于任意不為null的引用值x,x.equals(x)一定是true;
  • 對稱性(symmetric)。對于任意不為null的引用值x和y,當且僅當x.equals(y)是true時,y.equals(x)也是true;
  • 傳遞性(transitive)。對于任意不為null的引用值x、y和z,如果x.equals(y)是true,同時y.equals(z)是true,那么x.equals(z)一定是true;
  • 一致性(consistent)。對于任意不為null的引用值x和y,如果用于equals比較的對象信息沒有被修改的話,多次調用時x.equals(y)要么一致地返回true要么一致地返回false;
  • 對于任意不為null的引用值x,x.equals(null)返回false;

對照上面特質,我們發現Object方法直接比較的是兩個引用地址,只有兩個地址相同才相等,也就是說是差別可能性最大的等價關系。

而String的equals方法,不僅包含應用地址相同這種情況,還包括里面所存儲的字符串值相同的情況。也就是說雖然是兩個String對象,但是它們的字符串值相等,那么equals方法返回的結果就是true。這也正是大多數情況下我們所說的“equals方法比較的是值”。

由于Object的equals方法的默認特例存在,因此在沒有自定義equals方法時,我們不能一概的說equals方法比較的是具體的值,而“==”比較的是引用。

hashCode()方法

hashCode()方法返回對象的一個hash code值。該方法被用于hash tables,如HashSet、HashMap。

hashCode()是一個native方法,返回值類型是整形,并且可以被重寫。

Object中的native hashCode()方法將對象在內存中的地址作為哈希碼返回,可以保證不同對象的返回值不同。

還以String類為例,它的hashCode方法為:

  1. // 重寫hashCode方法 
  2. public int hashCode() { 
  3.     int h = hash; 
  4.     if (h == 0 && value.length > 0) { 
  5.         char val[] = value; 
  6.  
  7.         for (int i = 0; i < value.length; i++) { 
  8.             h = 31 * h + val[i]; 
  9.         } 
  10.         hash = h; 
  11.     } 
  12.     return h; 

上述hash值的計算注釋中有說明,基本公式為:s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]。

其中, s[i]是字符串的第i個字符,n是字符串的長度,^表示求冪(空字符串的哈希碼為0)。

計算過程中使用數字31,主要有以下原因:

1、由于質數的特性,它與其他數字相乘之后,計算結果唯一的概率更大,哈希沖突的概率更小。

2、使用的質數越大,哈希沖突的概率越小,但是計算的速度也越慢;31是哈希沖突和性能的折中,實際上是實驗觀測的結果。

3、JVM會自動對31進行優化:31 * i == (i << 5) - i;

hashCode()方法的作用

前面提到hashCode()方法主要用于hash表中,比如HashSet、HashMap等。

我們先來看一下ArrayList,它的底層是數組,每個數據往底層的數組中存取即可,數據不需要判斷是否重復。

集合Set中的元素是無序不可重復的,那么如何確保存入的元素不重復呢?逐個調用equals()方法進行比較?數據量少的時候還可以,但數據量大了時間復雜度基本上是O(n),會出現性能問題。

Java中采用哈希算法來解決這個問題,將對象(或數據)依特定算法直接映射到一個地址上,這樣時間復雜度趨于O(1),對象的存取效率大大提高。

集合Set添加某元素時,先調用hashCode()方法,定位到此元素實際存儲位置,如果這個位置沒有元素,說明是第一次存儲;若此位置有對象存在,調用equals()進行比較,相等就舍棄此元素不存,不等則散列到其他地址。

上面的示例也說明了為什么equals()相等,則hashCode()必須相等,進而當重寫了equals方法,也要對hashCode()方法進行重寫。

HashMap的基本處理機制與HashSet很類似,只不過底層的數據存儲結構有所不同而已。

簡而言之,在集合查找時,hashcode能極大的降低對象比較次數,提高查找效率。

hashCode()方法的性質

hashCode的實現也有一定的要求,相關英文說明在Object的equals方法注解上:

  • 在一個Java應用的執行期間,如果一個對象提供給equals做比較的信息沒有被修改的話,該對象多次調用hashCode()方法,該方法必須始終如一返回同一個integer。
  • 如果兩個對象根據equals(Object)方法是相等的,那么調用二者各自的hashCode()方法必須產生同一個integer結果。
  • 并不要求根據equals(java.lang.Object)方法不相等的兩個對象,調用二者各自的hashCode()方法必須產生不同的integer結果。但對于不同的對象產生不同的integer結果,有可能會提高hash table的性能。

如何重寫hashCode()

《Effective Java》中提供了一種簡單通用的hashCode算法。

A、初始化一個整形變量,為此變量賦予一個非零的常數值,比如int result = 17;

B、選取equals方法中用于比較的所有域(之所以只選擇equals()中使用的域,是為了保證上述原則的第1條),然后針對每個域的屬性進行計算:

  • (1) 如果是boolean值,則計算f ? 1:0
  • (2) 如果是byte\char\short\int,則計算(int)f
  • (3) 如果是long值,則計算(int)(f ^ (f >>> 32))
  • (4) 如果是float值,則計算Float.floatToIntBits(f)
  • (5) 如果是double值,則計算Double.doubleToLongBits(f),然后返回的結果是long,再用規則(3)去處理long,得到int
  • (6) 如果是對象應用,如果equals方法中采取遞歸調用的比較方式,那么hashCode中同樣采取遞歸調用hashCode的方式。否則需要為這個域計算一個范式,比如當這個域的值為null的時候,那么hashCode 值為0
  • (7) 如果是數組,那么需要為每個元素當做單獨的域來處理。java.util.Arrays.hashCode方法包含了8種基本類型數組和引用數組的hashCode計算,算法同上。

C、最后,把每個域的散列碼合并到對象的哈希碼中。

小結

關于equals方法很明確的是用于比較兩個對象是否相等。而對于hashCode方法重點是為了在類似HashMap場景下提升效率,只算是技術要求。

在集合中通常通過equals方法來比較對象是否相等,通過hashCode方法來解決大數據量時會發生的性能問題。

在實踐中我們很少使用Object對象來作為Map的key,也是因為如果Object對象的屬性變了,會導致hashCode變化,進而可能會導致找不到對應值,而String是不可變的對象,作為key就很適合。

參考文章:

https://www.cnblogs.com/kismetv/p/7191736.html

https://www.iteye.com/blog/kakajw-935226

https://www.iteye.com/blog/bijian1013-1972404

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2021-07-30 09:32:55

JavaEquals

2019-08-16 10:10:07

hashcodeequalsJava

2021-12-03 06:59:23

HashCodeEquals面試

2021-12-13 09:10:48

equalshashCodeJava

2023-10-08 07:13:19

equalshashCode哈希表

2021-07-13 06:42:58

JavaEquals方法

2009-10-13 14:38:15

.NET重寫URL

2022-01-11 06:53:23

面試重寫重載

2021-12-30 19:36:48

GoDubboJava

2022-01-07 14:05:33

DubboGoJava

2021-01-26 12:14:40

Windows 10Windows微軟

2015-10-10 10:36:00

warning category

2009-12-30 15:26:02

Silverlight

2009-09-04 11:35:05

C#方法重寫

2018-05-07 15:59:39

代碼程序員重寫

2015-07-27 15:27:11

程序員重寫代碼

2015-07-28 10:28:54

程序員代碼

2019-11-08 13:57:53

程序員Excel軟件

2021-04-08 11:46:41

String hashJava代碼

2022-12-28 09:10:44

HashMapImmutable類型
點贊
收藏

51CTO技術棧公眾號

成人一区二区三区中文字幕| 豆花视频一区二区| 自拍视频一区| 精品免费在线视频| 日本精品在线视频| 国产一二三四五区| www.成人在线视频| 亚洲综合偷拍欧美一区色| 国产女人水真多18毛片18精品 | 国产精品国产精品国产专区| 久久久久午夜电影| 亚洲一区二区综合| 国产精品美女无圣光视频| 师生出轨h灌满了1v1| 91超碰免费在线| 久久久久久免费| 国产成人短视频| 免费在线观看黄色小视频| 国产传媒在线| 国产成人在线视频网站| 日韩一中文字幕| 嫩草影院中文字幕| 国产在线超碰| 雨宫琴音一区二区在线| 亚洲欧美中文日韩在线v日本| 丰满的少妇愉情hd高清果冻传媒| 天天爱天天干天天操| 日本强好片久久久久久aaa| 免费不卡在线观看av| av在线网站观看| 精品国产鲁一鲁****| 午夜成人免费视频| 国产一区二区在线网站| 国产精品国产精品国产| 欧美日韩一区自拍| 在线亚洲男人天堂| 国产裸体免费无遮挡| 日本在线视频www鲁啊鲁| 国产人久久人人人人爽| 久久免费视频观看| 久久午夜精品视频| 精品在线手机视频| 日本高清无吗v一区| 日韩a级黄色片| 国产精品一区二区黑人巨大| 性8sex亚洲区入口| 国色天香2019中文字幕在线观看| 亚洲欧美日韩第一页| 日韩电影不卡一区| 精品欧美黑人一区二区三区| 777久久精品一区二区三区无码 | 91视频免费网址| 亚洲精品中文字幕乱码| 日韩中文字幕视频在线| 欧美人妻一区二区三区| 婷婷综合电影| 亚洲国产成人精品女人久久久| 97人人爽人人| 91精品国产一区二区在线观看| 日本韩国一区二区三区| 成人精品视频在线播放| av片哪里在线观看| 国产精品美女一区二区三区| 性高潮久久久久久久久| 牛牛澡牛牛爽一区二区| 26uuu国产日韩综合| 久久精品国产一区二区三区日韩| 好吊色一区二区| 国产 欧美在线| 51国偷自产一区二区三区| 99在线观看精品视频| 国产精品伦理久久久久久| 在线精品国产欧美| avhd101老司机| 色综合中文网| 色婷婷综合成人| 手机看片国产日韩| 欧美独立站高清久久| 精品国产乱码久久久久久1区2区 | 日本不卡一区| 噜噜噜在线观看播放视频| 久久综合久久久久88| 欧美精品一区二区三区在线看午夜| 天天色综合av| 91一区二区在线观看| 日本黄网免费一区二区精品| 国产中文字幕在线播放| 国产精品乱码久久久久久| 一卡二卡3卡四卡高清精品视频| 国产原创av在线| 亚洲精品视频在线看| 国产福利久久| 无码国产精品一区二区色情男同| 97se亚洲国产综合自在线| 欧美成人一区二区在线| 免费av在线网址| 一区二区三区久久| 国产精品亚洲αv天堂无码| 国产在线视频网址| 亚洲视频图片小说| 亚洲欧美日韩在线综合| 黄色在线免费| 国产欧美精品区一区二区三区 | 欧美人与牛zoz0性行为| 久久亚洲影音av资源网 | 人妻丰满熟妇av无码区hd| 2020国产精品久久精品美国| 国产91av视频在线观看| 99国产揄拍国产精品| 成人永久aaa| 欧美连裤袜在线视频| 二区三区在线观看| 欧美日韩国产综合新一区| 亚洲美女性囗交| 色综合视频一区二区三区44| 精品欧美激情精品一区| 日本中文字幕影院| 日本欧美韩国国产| 久久精品人人爽| 天天干在线播放| 国产mv日韩mv欧美| 色综合视频二区偷拍在线| 精灵使的剑舞无删减版在线观看| 欧美激情一二三区| 免费看日b视频| 久久爱.com| 亚洲精品美女免费| 91视频在线免费| 精品国产一区探花在线观看| 欧美精品国产精品日韩精品| 性高潮视频在线观看| 久久亚洲免费视频| 国产欧美精品aaaaaa片| 一区二区三区无毛| 精品亚洲国产成av人片传媒| 成人免费av片| 亚洲性感美女99在线| 成人黄色生活片| 99久久国产免费| 久久亚洲精品国产精品紫薇| 久操网在线观看| 国产羞羞视频在线播放| 欧美日韩三级在线| 亚洲做受高潮无遮挡| 在线日本高清免费不卡| 成人情视频高清免费观看电影| a√资源在线| 日本精品视频一区二区| 狠狠人妻久久久久久综合蜜桃| 亚洲午夜91| 粉嫩av一区二区三区免费观看 | 亚洲国产一区二区久久| 中文字幕免费国产精品| 国产一级片免费视频| 91麻豆精品一区二区三区| 国产高清www| 6080成人| 欧美激情视频免费观看| 亚洲精品无amm毛片| 99热在这里有精品免费| 毛片在线视频观看| 欧美精品三级在线| 欧美日本啪啪无遮挡网站| 亚洲精品97久久中文字幕无码| 亚洲欧美日韩人成在线播放| 91亚洲一区二区| 欧美一区激情| 成人黄色av免费在线观看| 国产一二区在线观看| 91麻豆精品国产91久久久久久久久| 美女福利视频网| 五月激情久久久| 91精品中文在线| 日夜干在线视频| 亚洲国产你懂的| 91精品人妻一区二区三区蜜桃欧美| 国产精品久久久亚洲一区| 国产精品久久久久久五月尺| 国产综合在线观看| 欧美这里有精品| 亚洲欧美综合7777色婷婷| 看国产成人h片视频| 亚洲啊啊啊啊啊| 日本韩国欧美超级黄在线观看| 热久久99这里有精品| av在线女优影院| 91精品国产91久久久久久一区二区| 成人性生活毛片| av成人免费在线观看| 久久久久久久久久福利| 欧美a在线观看| 欧美激情一区二区三区久久久| 免费看日韩av| 色综合久久66| xxxxx99| 成人爽a毛片一区二区免费| 男人操女人免费软件| 菠萝蜜一区二区| 2014国产精品| 视频在线日韩| 久久久精品在线| 欧美美女搞黄| 日韩欧美中文字幕制服| xxxx.国产| 国产精品家庭影院| 亚洲香蕉中文网| 天堂在线一区二区| 97干在线视频| 天天综合一区| 欧美高清视频一区| 国产精品亚洲欧美日韩一区在线 | 青青草成人免费| 日韩激情中文字幕| 国产免费一区二区三区四在线播放| 婷婷六月国产精品久久不卡| 亚洲精品美女久久久久| 中文字幕视频一区二区| 亚洲自拍偷拍网站| 国产调教在线观看| 97国产一区二区| 农村末发育av片一区二区| 美女性感视频久久| 大陆极品少妇内射aaaaa| 婷婷综合五月| 欧美一级爽aaaaa大片| 亚洲成人影音| 国产精品综合网站| 日本一区免费网站| 91禁国产网站| 羞羞的视频在线看| 最近2019中文字幕mv免费看| 亚洲av毛片成人精品| 精品成人佐山爱一区二区| 国产黄色av网站| 91麻豆精品国产91久久久更新时间| 中文字幕二区三区| 欧美丝袜丝nylons| 中文字幕久久久久| 欧美亚洲国产一卡| 中文字幕精品一区二| 欧美日韩一区二区三区四区五区| 午夜精品一区二| 欧美天堂在线观看| 黄色片视频免费| 欧美在线免费观看亚洲| 国产精品自拍第一页| 在线观看国产精品网站| 成年人晚上看的视频| 欧美亚州韩日在线看免费版国语版| 国产三级精品三级在线观看| 欧美性xxxx18| 亚洲精品一区二三区| 欧美乱妇20p| 99在线精品视频免费观看20| 日韩欧美精品在线视频| 亚洲欧美激情另类| 亚洲国产精品一区二区久| 婷婷五月综合久久中文字幕| 日韩精品在线播放| 国产露出视频在线观看| 自拍偷拍亚洲欧美| av免费在线网站| 91精品国产高清久久久久久| 日韩国产激情| 国产一区二区在线免费视频| 精品久久久久久久久久岛国gif| 97久久精品午夜一区二区| 99久热这里只有精品视频免费观看| 国产精品一区二区三区免费| 亚洲黄页在线观看| 一区二区冒白浆视频| 亚洲精品小说| 欧美久久久久久久久久久久久| 狂野欧美性猛交xxxx巴西| 性chinese极品按摩| 国产成人精品综合在线观看| 艳妇乳肉亭妇荡乳av| 欧美国产精品一区二区| 青青草原在线免费观看| 婷婷开心激情综合| 国模无码国产精品视频| 亚洲成人高清在线| 国产第一页在线观看| 日韩一区二区三区四区五区六区| 天堂国产一区二区三区| 中文字幕在线观看亚洲| 天堂av最新在线| 国产精品第2页| 成人免费在线电影网| 日韩国产欧美一区| 国精品一区二区| 一道本视频在线观看| 成人免费看的视频| 国产又粗又长又黄的视频| 亚洲成年人影院| 97人妻人人澡人人爽人人精品| 亚洲第一区在线| 黄网站免费在线观看| 欧美中文在线字幕| 亚洲国产视频二区| 亚洲美女搞黄| 在线一区欧美| 好吊操视频这里只有精品| 亚洲国产电影在线观看| 日韩xxx高潮hd| 欧美一二三区在线| 成年人视频在线免费观看| 97国产精品人人爽人人做| crdy在线观看欧美| 神马影院午夜我不卡| 亚洲精品社区| 国产精品一级无码| 中文字幕视频一区| 国产情侣小视频| 精品亚洲永久免费精品| 欧洲一区二区三区| 91精品在线观看视频| 欧美一区二区三区高清视频| 亚洲午夜精品久久久久久人妖| 国产电影一区二区三区| 青青青视频在线播放| 在线观看91视频| 欧美人体大胆444www| 91精品国产网站| 久久97精品| 欧美精品久久久久久久久久久| 国产美女av一区二区三区| 亚洲少妇一区二区| 日韩美女啊v在线免费观看| 99re热视频| 亚洲日本中文字幕免费在线不卡| av福利导福航大全在线| 国产成人精品日本亚洲11 | 国产欧美日韩麻豆91| 91精品国产综合久久久蜜臀九色 | 黑丝av在线播放| 亚洲国产视频在线| 亚洲a视频在线观看| 欧美成人性色生活仑片| 亚洲国产中文在线二区三区免| 国产av不卡一区二区| 国产一区二区视频在线| 丰满人妻一区二区三区免费视频棣 | 日本黄色www| 欧美美女日韩| 久久亚洲精华国产精华液| 欧美伊久线香蕉线新在线| 国产福利短视频| 色是在线视频| 中文字幕一区二区三区在线观看 | 7777在线视频| 午夜国产福利在线| 精品久久国产精品| 日韩美香港a一级毛片| 亚洲综合视频一区| 激情欧美一区二区| 欧美成人国产精品高潮| 精品处破学生在线二十三| 色资源二区在线视频| 日本不卡在线观看| 久久99精品久久久| 欧美成人手机视频| 亚洲高清一二三区| 国产精品久久久久av电视剧| 亚洲精品国产精品久久| 国产一区二区福利| 日本少妇久久久| 亚洲天堂第二页| 国产精选久久| 久色视频在线播放| 久久精品日产第一区二区三区高清版 | 日韩欧美三级| 秋霞午夜鲁丝一区二区| 天天综合色天天| 啊v在线视频| 51国产成人精品午夜福中文下载| 亚洲美女视频在线免费观看| 免费看黄色的视频| 日韩一级片在线观看| 青青青免费在线视频| 一本一本久久a久久精品综合妖精| 国产精品69毛片高清亚洲| 天天操天天操天天操天天| 日韩在线视频播放| 精品深夜福利视频| 91高清国产视频| 五月天激情综合| 午夜毛片在线| 久久久久免费网| 精品一区二区三区免费观看 | 欧美亚洲国产一区二区三区va| av色综合久久天堂av色综合在| 久久综合福利| 国产一区在线观看视频| 狠狠人妻久久久久久综合| 伦理中文字幕亚洲| 国产欧美日韩精品一区二区免费 | 无码精品黑人一区二区三区| 国产精品免费一区豆花| 国产专区一区|