為什麼在定義hashcode時要使用31這個數呢?

2021-06-22 06:59:25 字數 456 閱讀 7519

public int hashcode()  

hash = h; 

} return h; 

} 該函式是我看的函式介面原始碼,為什麼要使用31這個數呢?

其實上面的實現也可以總結成數數裡面下面這樣的公式:

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]

原因如下:

a.31是乙個素數,素數作用就是如果我用乙個數字來乘以這個素數,那麼最終的出來的結果只能被素數本身和被乘數還有1來整除!。(減少衝突)

b.31可以 由i*31== (i<<5)-1來表示,

現在很多虛擬機器裡面都有做相關優化.(提高演算法效率)

c.選擇係數的時候要選擇盡量大的係數。因為如果計算出來的hash位址越大,所謂的「衝突」就越少,查詢起來效率也會提高。(減少衝突)

d.並且31只占用5bits,相乘造成資料溢位的概率較小。

為什麼在定義hashcode時要使用31這個數呢?

public int hashcode hash h return h 該函式是我看的函式介面原始碼,為什麼要使用31這個數呢?其實上面的實現也可以總結成數數裡面下面這樣的公式 s 0 31 n 1 s 1 31 n 2 s n 1 原因如下 a.31是乙個素數,素數作用就是如果我用乙個數字來乘以這...

為什麼要有 hashCode

當你把物件加入 hashset 時,hashset 會先計算物件的 hashcode 值來判斷物件加入的位 置,同時也會與其他已經加入的物件的 hashcode 值作比較,如果沒有相符的hashcode,hashset會假設物件沒有重複出現。但是如果發現有相同 hashcode 值的物件,這時會呼叫...

為什麼要重寫hashcode 方法

j a中的集合 collection 有兩類,一類是list,再有一類是set。前者集合內的元素是有序的,元素可以重複 後者元素無序,但元素不可重複。那麼我們怎麼判斷兩個元素是否重複呢?這就是object.equals方法了。通常想查詢乙個集合中是否包含某個物件,就是逐一取出每個元素與要查詢的元素進...