關(guān)于hash code的作用,先來(lái)說(shuō)一下自己的理解。
一般來(lái)說(shuō)我們提到hash code,就是在比較兩個(gè)對(duì)象是否相等的時(shí)候。從這一點(diǎn)入手,我們以hashmap來(lái)舉例:hashmap中的數(shù)據(jù)是以entry鍵值對(duì)的形式存在的,hashmap是基于散列的集合,他的存儲(chǔ)是通過(guò)hashcode來(lái)存儲(chǔ)的。為什么要以這樣的形式呢,這里就要考慮到hashmap的插入問(wèn)題了。假設(shè)要往一個(gè)數(shù)據(jù)量很大的map中插入一條數(shù)據(jù),應(yīng)該怎么插入呢?可能有的人會(huì)說(shuō)用equals進(jìn)行比較。這確實(shí)是一種辦法,但是大家要考慮的問(wèn)題是這個(gè)map的數(shù)據(jù)量很大,單純的用equals和map中的每條數(shù)據(jù)進(jìn)行比較,這必然導(dǎo)致了查詢效率的低下。這時(shí)候hashcode的作用就體現(xiàn)出來(lái)了,map中的數(shù)據(jù)存儲(chǔ)是具有相同hashcode的數(shù)據(jù)散列在一起。舉一個(gè)相對(duì)比較生動(dòng)的例子:
map中的hashcode就像是一個(gè)個(gè)不同編號(hào)的籃子,當(dāng)有數(shù)據(jù)要插入map中時(shí),首先獲取數(shù)據(jù)的hashcode值,然后在map中找對(duì)應(yīng)的hashcode(籃子),如果沒(méi)有找到就在map中創(chuàng)建一個(gè)籃子把插入的數(shù)據(jù)放進(jìn)去(即沒(méi)有該數(shù)據(jù)的hashcode,就直接存進(jìn)map中,不再做任何比較);如果找到了對(duì)應(yīng)的籃子(即相同的hashcode),然后再和籃子中的數(shù)據(jù)挨個(gè)進(jìn)行equals比較,如果相同就不放進(jìn)去,不同就把該數(shù)據(jù)放進(jìn)這個(gè)籃子里。
通過(guò)這樣的一個(gè)例子可以清晰的看出利用hashcode對(duì)map進(jìn)行插入操作的話,效率會(huì)明顯的提高。
對(duì)hashcode進(jìn)行一下簡(jiǎn)單的總結(jié):
如果兩個(gè)對(duì)象的equals比較結(jié)果為true,那么這兩個(gè)對(duì)象的hashcode值必定相等;
如果兩個(gè)對(duì)象的equals比較結(jié)果為false,那么這兩個(gè)對(duì)象的hashcode值有可能相等也可能不相等;(不同的數(shù)據(jù),可以放在一個(gè)籃子里)
如果兩個(gè)對(duì)象的hashcode值相等,那兩個(gè)對(duì)象的equals比較結(jié)果則有可能為true,也可能為false;(通俗點(diǎn)講就是我一個(gè)籃子里不能只放一個(gè)數(shù)據(jù)吧,那這樣就太浪費(fèi)了)
如果兩個(gè)對(duì)象的hashcode值不相等,那兩個(gè)對(duì)象的equals比較結(jié)果一定為false;
通過(guò)上面的這些我的理解是hashcode的作用就是為了查找使用的,這樣做能夠提高查找效率。下面貼一段HashCode的官方文檔定義:
hashcode方法返回該對(duì)象的哈希碼值。支持該方法是為哈希表提供一些優(yōu)點(diǎn),例如,java.util.Hashtable?提供的哈希表。
hashCode?的常規(guī)協(xié)定是:
在?Java?應(yīng)用程序執(zhí)行期間,在同一對(duì)象上多次調(diào)用?hashCode?方法時(shí),必須一致地返回相同的整數(shù),前提是對(duì)象上?equals?比較中所用的信息沒(méi)有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無(wú)需保持一致。
如果根據(jù)?equals(Object)?方法,兩個(gè)對(duì)象是相等的,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用?hashCode?方法都必須生成相同的整數(shù)結(jié)果。
以下情況不?是必需的:如果根據(jù)?equals(java.lang.Object)?方法,兩個(gè)對(duì)象不相等,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用?hashCode?方法必定會(huì)生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該知道,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。
實(shí)際上,由?Object?類定義的?hashCode?方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)。(這一般是通過(guò)將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來(lái)實(shí)現(xiàn)的,但是?JavaTM?編程語(yǔ)言不需要這種實(shí)現(xiàn)技巧。)
當(dāng)equals方法被重寫時(shí),通常有必要重寫?hashCode?方法,以維護(hù)?hashCode?方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。
本文參考與http://blog.csdn.net/fenglibing/article/details/8905007;https://www.cnblogs.com/dolphin0520/p/3681042.html