hashCode到底有什麼用?

2021-09-20 07:50:22 字數 1041 閱讀 9241

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去重的效果。

介面到底有什麼用

我們定義乙個介面 public inte ce ibark 再定義乙個類,繼承於ibark,並且必需實現其中的bark 方法 public class dog ibark public void bark 然後,宣告dog的乙個例項,並呼叫bark 方法 dog 旺財 new dog 旺財.bark...

學歷到底有什麼用

每年都會有不少想考研又在猶豫的學弟學妹問我,考研有用嗎?我也跟不少高學歷的朋友聊過,這個 學歷 到底有什麼用。乙個有趣的現象是,一般上了研的,都喜歡自嘲說,學歷啊 名校啊什麼的,都是浮雲。或者大呼後悔,說想到又 浪費 了自己幾年的光陰,很是悔不當初。問起當年考研的原因,多半是興趣所致,或是覺得自己的...

讀書到底有什麼用

1 腳步不能丈量的地方,文字可以 眼睛到不了的地方,文字可以。2 我讀書為的就是不遇到我不想遇到的人。3 年輕的時候以為不讀書不足以了解人生,直到後來才發現如果不了解人生,是讀不懂書的。讀書的意義大概就是,用生活所感去讀書,用讀書所得去生活。4 讀書,不是為了拿文憑或發大財,而是為了成為乙個有溫度懂...