亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java中hashCode方法與equals方法的用法總結

2019-11-26 15:56:31
字體:
來源:轉載
供稿:網友

首先,想要明白hashCode的作用,必須要先知道Java中的集合?! ?

總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。 前者集合內的元素是有序的,元素可以重復;后者元素無序,但元素不可重復。

那么這里就有一個比較嚴重的問題了:要想保證元素不重復,可兩個元素是否重復應該依據什么來判斷呢? 這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那么當元素很多時,后添加到集合中的元素比較的次數就非常多了。 也就是說,如果集合中現在已經有1000個元素,那么第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。  

于是,Java采用了哈希表的原理。哈希(Hash)實際上是個人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也稱為散列算法,是將數據依特定算法直接指定到一個地址上。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能并不是)。  

這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。 如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。 所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。 

所以,Java對于eqauls方法和hashCode方法是這樣規定的:

1、如果兩個對象相同,那么它們的hashCode值一定要相同;

2、如果兩個對象的hashCode相同,它們并不一定相同(上面說的對象相同指的是用eqauls方法比較。)  

你當然可以不按要求去做了,但你會發現,相同的對象可以出現在Set集合中。同時,增加新元素的效率會大大下降。

hashcode這個方法是用來鑒定2個對象是否相等的。 那你會說,不是還有equals這個方法嗎? 不錯,這2個方法都是用來判斷2個對象是否相等的。但是他們是有區別的。 一般來講,equals這個方法是給用戶調用的,如果你想判斷2個對象是否相等,你可以重寫equals方法,然后在代碼中調用,就可以判斷他們是否相等 了。簡單來講,equals方法主要是用來判斷從表面上看或者從內容上看,2個對象是不是相等。

舉個例子,有個學生類,屬性只有姓名和性別,那么我們可以 認為只要姓名和性別相等,那么就說這2個對象是相等的。 hashcode方法一般用戶不會去調用,比如在hashmap中,由于key是不可以重復的,他在判斷key是不是重復的時候就判斷了hashcode 這個方法,而且也用到了equals方法。這里不可以重復是說equals和hashcode只要有一個不等就可以了!所以簡單來講,hashcode相 當于是一個對象的編碼,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比較起來不直觀。我們一般在覆蓋equals的同時也要 覆蓋hashcode,讓他們的邏輯一致。舉個例子,還是剛剛的例子,如果姓名和性別相等就算2個對象相等的話,那么hashcode的方法也要返回姓名 的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。 要從物理上判斷2個對象是否相等,用==就可以了。

在Java語言中,equals()和hashCode()兩個函數的使用是緊密配合的,你要是自己設計其中一個,就要設計另外一個。在多數情況 下,這兩個函數是不用考慮的,直接使用它們的默認設計就可以了。但是在一些情況下,這兩個函數最好是自己設計,才能確保整個程序的正常運行。最常見的是當 一個對象被加入收集對象(collection object)時,這兩個函數必須自己設計。更細化的定義是:如果你想將一個對象A放入另一個收集對象B里,或者使用這個對象A為查找一個元對象在收集對 象B里位置的鑰匙,并支持是否容納,刪除收集對象B里的元對象這樣的操作,那么,equals()和hashCode()函數必須開發者自己定義。其他情 況下,這兩個函數是不需要定義的。

equals():

它是用于進行兩個對象的比較的,是對象內容的比較,當然也能用于進行對象參閱值的比較。什么是對象參閱值的比較?就是兩個參閱變量的值得比較,我們 都知道參閱變量的值其實就是一個數字,這個數字可以看成是鑒別不同對象的代號。兩個對象參閱值的比較,就是兩個數字的比較,兩個代號的比較。這種比較是默 認的對象比較方式,在Object這個對象中,這種方式就已經設計好了。所以你也不用自己來重寫,浪費不必要的時間。

對象內容的比較才是設計equals()的真正目的,Java語言對equals()的要求如下,這些要求是必須遵循的。否則,你就不該浪費時間:

•對稱性:如果x.equals(y)返回是“true”,那么y.equals(x)也應該返回是“true”。

•反射性:x.equals(x)必須返回是“true”。

•類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也應該返回是“true”。

•還有一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是“true”。

•任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。

hashCode():
這個函數返回的就是一個用來進行赫希操作的整型代號,請不要把這個代號和前面所說的參閱變量所代表的代號弄混了。后者不僅僅是個代號還具有在內存中才查找對 象的位置的功能。hashCode()所返回的值是用來分類對象在一些特定的收集對象中的位置。這些對象是HashMap, Hashtable, HashSet,等等。這個函數和上面的equals()函數必須自己設計,用來協助HashMap, Hashtable, HashSet,等等對自己所收集的大量對象進行搜尋和定位。

這些收集對象究竟如何工作的,想象每個元對象hashCode是一個箱子的 編碼,按照編碼,每個元對象就是根據hashCode()提供的代號歸入相應的箱子里。所有的箱子加起來就是一個HashSet,HashMap,或 Hashtable對象,我們需要尋找一個元對象時,先看它的代碼,就是hashCode()返回的整型值,這樣我們找到它所在的箱子,然后在箱子里,每 個元對象都拿出來一個個和我們要找的對象進行對比,如果兩個對象的內容相等,我們的搜尋也就結束。這種操作需要兩個重要的信息,一是對象的 hashCode(),還有一個是對象內容對比的結果。

hashCode()的返回值和equals()的關系如下:

•如果x.equals(y)返回“true”,那么x和y的hashCode()必須相等。

•如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。

為什么這兩個規則是這樣的,原因其實很簡單,拿HashSet來說吧,HashSet可以擁有一個或更多的箱子,在同一個箱子中可以有一個 或更多的獨特元對象(HashSet所容納的必須是獨特的元對象)。這個例子說明一個元對象可以和其他不同的元對象擁有相同的hashCode。但是一個 元對象只能和擁有同樣內容的元對象相等。所以這兩個規則必須成立。

設計這兩個函數所要注意到的:
如果你設計的對象類型并不使用于收集性對象,那么沒有必要自己再設計這兩個函數的處理方式。這是正確的面向對象設計方法,任何用戶一時用不到的功能,就先不要設計,以免給日后功能擴展帶來麻煩。

如果你在設計時想別出心裁,不遵守以上的兩套規則,那么勸你還是不要做這樣想入非非的事。我還沒有遇到過哪一個開發者和我說設計這兩個函數要違背前面說的兩個規則,我碰到這些違反規則的情況時,都是作為設計錯誤處理。

當一個對象類型作為收集型對象的元對象時,這個對象應該擁有自己處理equals(),和/或處理hashCode()的設計,而且要遵守前面所說 的兩種原則。equals()先要查null和是否是同一類型。查同一類型是為了避免出現ClassCastException這樣的異常給丟出來。查 null是為了避免出現NullPointerException這樣的異常給丟出來。

如果你的對象里面容納的數據過多,那么這兩個函數 equals()和hashCode()將會變得效率低。如果對象中擁有無法serialized的數據,equals()有可能在操作中出現錯誤。想象 一個對象x,它的一個整型數據是transient型(不能被serialize成二進制數據流)。然而equals()和hashCode()都有依靠 這個整型數據,那么,這個對象在serialization之前和之后,是否一樣?答案是不一樣。因為serialization之前的整型數據是有效的 數據,在serialization之后,這個整型數據的值并沒有存儲下來,再重新由二進制數據流轉換成對象后,兩者(對象在serialization 之前和之后)的狀態已經不同了。這也是要注意的。

知道以上這些能夠幫助你:

1. 進行更好的設計和開發。

2. 進行更好的測試案例開發。

3. 在面試過程中讓面試者對你的學識淵博感到滿意。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线激情影院一区| 亚洲第一黄色网| 久久琪琪电影院| 欧美日韩成人在线播放| 午夜精品福利电影| 色视频www在线播放国产成人| 国内精品久久久久久中文字幕| 精品久久久久久久久久久久久| 色一情一乱一区二区| 久久国产精品影片| 高清在线视频日韩欧美| 成人久久久久久久| 亚洲欧美成人在线| 久久综合九色九九| 精品无人区乱码1区2区3区在线| 成人精品久久一区二区三区| 国内精品久久久久久| 欧美日韩亚洲成人| 欧美日本在线视频中文字字幕| 中文字幕日韩电影| www.亚洲成人| 亚洲天堂网站在线观看视频| 最近免费中文字幕视频2019| 日韩精品免费在线| 欧美亚洲另类激情另类| 国产999精品久久久| 日韩在线观看电影| 久久久久久久久久久久久久久久久久av| 成人黄色激情网| 91中文字幕在线观看| 国产精品7m视频| 久久99久久99精品中文字幕| 91精品国产高清自在线看超| 亚洲精品一区av在线播放| 日韩久久午夜影院| 夜夜嗨av色一区二区不卡| 亚洲精品720p| 亚洲电影免费在线观看| 亚洲一区二区精品| 日韩在线观看高清| 欧美性精品220| 成人免费网站在线观看| 久久天天躁狠狠躁夜夜av| 亚洲美女久久久| 日韩电影免费观看在线观看| 97国产精品视频人人做人人爱| 另类专区欧美制服同性| 成人精品视频久久久久| 九九精品在线观看| 国产日韩欧美电影在线观看| 日韩精品中文字幕久久臀| 中文字幕在线看视频国产欧美在线看完整| 日产精品99久久久久久| 96国产粉嫩美女| 国产亚洲精品美女久久久久| 欧美成人免费va影院高清| 亚洲视频在线观看网站| 国产日韩精品入口| 国产盗摄xxxx视频xxx69| 最新国产精品亚洲| 欧美日韩国产中文字幕| 久久精品亚洲国产| 中文字幕亚洲专区| 亚洲高清免费观看高清完整版| 亚洲国产91精品在线观看| 亚洲电影免费在线观看| 国产91在线高潮白浆在线观看| 97精品一区二区视频在线观看| 国产精品夫妻激情| 亚洲国产91色在线| 2018中文字幕一区二区三区| 九九视频直播综合网| 九九热99久久久国产盗摄| 亚洲国产精品一区二区久| 亚洲曰本av电影| 日韩精品在线视频观看| 一区二区三区 在线观看视| 亚洲国产私拍精品国模在线观看| 日韩在线视频国产| 欧美成人激情视频免费观看| 国产精品第一页在线| www.久久久久久.com| 亚洲一区二区中文| 欧美有码在线观看| 亚洲乱亚洲乱妇无码| 亚洲日韩欧美视频一区| 国语对白做受69| 国产精品一二三在线| 亚洲福利视频专区| 国产美女高潮久久白浆| 欧美日韩一二三四五区| 国产在线高清精品| 日韩av成人在线观看| 操人视频在线观看欧美| 欧美色另类天堂2015| 亚洲欧美国产日韩天堂区| 国产91精品高潮白浆喷水| 欧美体内谢she精2性欧美| 成人性生交大片免费看小说| 国产精品日韩在线一区| 欧美成人全部免费| 色偷偷av一区二区三区乱| 一区二区三区视频在线| 国语自产精品视频在免费| 日韩毛片中文字幕| 日韩美女免费视频| 91麻豆国产语对白在线观看| 性色av一区二区三区红粉影视| 成人免费高清完整版在线观看| 欧美成人亚洲成人日韩成人| 亚洲视频一区二区| 久久成人免费视频| 亚洲性视频网站| 国产精品成人av性教育| 国产精品欧美亚洲777777| 欧美日韩国产精品一区二区不卡中文| 国产一区二区日韩精品欧美精品| www.亚洲天堂| 国产亚洲欧洲高清| 欧美在线一区二区三区四| 欧美成人精品xxx| 91久久嫩草影院一区二区| 亚洲激情视频在线播放| 亚洲精品电影网站| 亚洲精品久久久久久久久久久久久| 国产伦精品免费视频| 在线播放日韩精品| 51视频国产精品一区二区| 国产精品高潮在线| 亚洲欧洲高清在线| 久久99精品久久久久久琪琪| 成人网欧美在线视频| 精品国产一区久久久| 亚洲人午夜精品| 欧美美女15p| 日日摸夜夜添一区| 奇门遁甲1982国语版免费观看高清| 97免费视频在线| 日本伊人精品一区二区三区介绍| 8090成年在线看片午夜| 精品性高朝久久久久久久| 欧美日韩在线影院| 欧美夫妻性生活xx| 久久久久久高潮国产精品视| 91社区国产高清| 成人看片人aa| 亚洲毛茸茸少妇高潮呻吟| 中文字幕欧美精品在线| 久久网福利资源网站| 色偷偷888欧美精品久久久| 久久激情五月丁香伊人| 亚洲成人av资源网| 国产成人欧美在线观看| 亚洲精品短视频| 久久av中文字幕| 一色桃子一区二区| 九九精品视频在线观看| 亚洲高清久久网| 成人久久18免费网站图片| 17婷婷久久www| 韩国一区二区电影| 亚洲精品欧美日韩专区| 亚洲国产欧美一区二区三区同亚洲| 欧美孕妇孕交黑巨大网站|