日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hashCode到底有什么用?

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hashCode到底有什么用? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?hashCode到底有什么用?

hashCode概念


hashCode是jdk根據對象的地址算出來的一個int數字,即對象的哈希碼值,代表了該對象在內存中的存儲位置。


我們都知道hashCode()方法是頂級類Object類的提供的一個方法,所有的類都可以進行對hashCode方法重寫。


我們也知道在比較一個類是否相同時往往會重寫equals方法,值得注意的是,重寫equals方法的同時必須也要重寫hashCode方法,多次調用一個對象的hashCode方法必須返回同一個數字,這也是必須遵守的規范,不然會造必須存在的危害。


hash沖突


當兩個對象equals相同,hashCode規定也必須相同,但反過來就不一定,兩個對象對應一個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到底有什么用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。