Java中hashcode核心算法

hashcode 與 equal 方法的關係

  • 從規則的角度看

    • 如果兩個對象相同, equals方法一定返回true,並且這兩個對象的HashCode一定相同;
    • 兩個對象的HashCode相同,並不一定表示兩個對象就相同,即equals()不一定爲true,只能說明這兩個對象在一個散列存儲結構中。
    • 兩個對象的HashCode不相同,這兩個對象一定不相同,equals()一定不爲true
  • 從功能的角度看

    • equals方法用於判定兩個對象是否相同
    • hashcode用於快速查找對象位置(通過取模運算)

核心源碼

以下爲String對象的HashCode方法

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) { //如果hash值首次運算
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];//核心算法,考慮在int大小的空間中散列相對均勻 
        }
        hash = h;
    }
    return h;
}

static final int hash(Object key) {
    int h;
    //高16位和低16位做異或運算,目的是散列更均勻
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

代碼通過循環 h = 31 * h + val[i] 公式將一個String對象中所有的字符做爲參數串在一起做了一個散列運算。

該散列運算的目的只有一個,在整形的數值區間 [-2147483648, 2147483647]上,算出來的值足夠分散,值相同的碰撞越少越好。(區間大小爲 2^32)

好了hashcode的算法核心思想已經講清楚了,至於爲什麼公式中用的乘數是31,如下文章講的非常透徹。

https://blog.csdn.net/zhujohnle/article/details/100538706 詳細探討HashCode算法爲什麼採用31作爲乘數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章