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
上一篇:
HDU 1394 線段樹單點更新求逆序數
下一篇:
Java多線程(二)、啟動一個線程的3種方式
利用TFRecord和HDFS準備TensorFlow訓練數據
數據庫相關
【聚能聊有獎話題】Boring隧道掘進機完成首段挖掘,離未來交通還有多遠?
數字機內存儲
Android 的WebView使用CookieManager崩潰的問題
cgroup子係統1_cpu子係統
mysql hash 索引 vs B-TREE 索引 理解
阿裏雲全球第二批MVP 祁寧專訪 - 社區的成長才是我們的價值所在
Android 係統Menu樣式的修改
java 後台框架 支持APP接口調用 APP後台 java springmvc mybaits mysql oracle html5 後台框架 手機後台框架