hashCode到底有什么用?
轉載自?hashCode到底有什么用?
hashCode概念
hashCode是jdk根據對象的地址算出來的一個int數字,即對象的哈希碼值,代表了該對象在內存中的存儲位置。
我們都知道hashCode()方法是頂級類Object類的提供的一個方法,所有的類都可以進行對hashCode方法重寫。
我們也知道在比較一個類是否相同時往往會重寫equals方法,值得注意的是,重寫equals方法的同時必須也要重寫hashCode方法,多次調用一個對象的hashCode方法必須返回同一個數字,這也是必須遵守的規(guī)范,不然會造必須存在的危害。
hash沖突
當兩個對象equals相同,hashCode規(guī)定也必須相同,但反過來就不一定,兩個對象對應一個hashCode,但equals卻并不相等。。這就是傳說中的hash沖突。HashMap是以hashCode取模數組形式存放值的,那兩個對象hashCode一樣會不會造成前一個對象的值覆蓋呢?答案是不會,因為它采用了另外一種鏈表數據結構來解決hash沖突的情況,即使兩個對象的hashCode一樣,它們會放到當前數組索引位置的鏈表中。
hashCode設計
HashSet通過HashMap來實現的,用來存儲不重復數據的,怎么判斷里面的對象是否重復呢?判斷對象是否重復即是判斷對象里面的屬性是否都一樣,這時必須是重寫了equals方法去比較對象的里面所有的值,而不是比較引用地址,比較引用地址它們永遠都不相等,除非是同一個對象。通過equals比較的過程性能是非常不佳的,所以有了hashCode這個設計,簡單兩個數字的比較性equals沒法比的,所以可以先通過比較對象的hashCode是否一樣確定是不是同一個對象,如果hashCode不一樣這時肯定就不是同一個對象,反之如果hashCode一樣而且equals或者==也一樣這肯定就是同一個對象。所以先比較數字的hashCode再比較equals或者==,這樣效率會明顯提升。
假如我們重寫了equals而不重寫hashCode方法,多個對象屬性值一樣的它們的hashCode肯定是不一樣的,這時作為key在put到map中的時候,就會有多個這樣的key,而達不到對象作為key的場景,同樣也達不到HashSet去重的效果。
總結
以上是生活随笔為你收集整理的hashCode到底有什么用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做3dmax的电脑配置?
- 下一篇: 刚刚买了个二手台式电脑联想的。你们觉的怎