閱讀529 返回首頁    go 微軟 go windows


HashCode的作用

原文:https://hellsing42.iteye.com/blog/668946

首先,想要明白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集合中。同時,增加新元素的效率會大大下降。

最後更新:2017-04-03 18:51:58

  上一篇:go HDU 1394 線段樹單點更新求逆序數
  下一篇:go Java多線程(二)、啟動一個線程的3種方式