轉載 http://www.cnblogs.com/lwbqqyumidi/p/3693015.htmlhtml
public native int hashCode();算法
hashCode()方法返回一個整形數值,表示該對象的哈希碼值。性能
hashCode()具備以下約定:spa
1).在Java應用程序程序執行期間,對於同一對象屢次調用hashCode()方法時,其返回的哈希碼是相同的,前提是將對象進行equals比較時所用的標尺信息未作修改。在Java應用程序的一次執行到另一次執行,同一對象的hashCode()返回的哈希碼無須保持一致;htm
2).若是兩個對象相等(依據:調用equals()方法),那麼這兩個對象調用hashCode()返回的哈希碼也必須相等;對象
3).反之,兩個對象調用hasCode()返回的哈希碼相等,這兩個對象不必定相等。blog
即嚴格的數學邏輯表示爲: 兩個對象相等 <=> equals()相等 => hashCode()相等。所以,重寫equlas()方法必須重寫hashCode()方法,以保證此邏輯嚴格成立,同時能夠推理出:hasCode()不相等 => equals()不相等 <=> 兩個對象不相等。內存
可能有人在此產生疑問:既然比較兩個對象是否相等的惟一條件(也是衝要條件)是equals,那麼爲何還要弄出一個hashCode(),而且進行如此約定,弄得這麼麻煩?數學
其實,這主要體如今hashCode()方法的做用上,其主要用於加強哈希表的性能。hash
以集合類中,以Set爲例,當新加一個對象時,須要判斷現有集合中是否已經存在與此對象相等的對象,若是沒有hashCode()方法,須要將Set進行一次遍歷,並逐一用equals()方法判斷兩個對象是否相等,此種算法時間複雜度爲o(n)。經過藉助於hasCode方法,先計算出即將新加入對象的哈希碼,而後根據哈希算法計算出此對象的位置,直接判斷此位置上是否已有對象便可。(注:Set的底層用的是Map的原理實現)
在此須要糾正一個理解上的誤區:對象的hashCode()返回的不是對象所在的物理內存地址。甚至也不必定是對象的邏輯地址,hashCode()相同的兩個對象,不必定相等,換言之,不相等的兩個對象,hashCode()返回的哈希碼可能相同。
注:兩個對象利用hash算法肯定存儲位置時,可能放到同一個位置,這時候須要處理這個衝突。