Hashcode相同但是equals不同的例子

weixin_33861800發表於2018-03-06

大家都知道equals()相同時 hashcode 必須相同 但是hashcode相同並不一定eqauls 但是具體的例子還真沒看過 我們可以看到String 的 hashcode()方法如下

public int hashCode() {
        int var1 = this.hash;
        if (var1 == 0 && this.value.length > 0) {
            char[] var2 = this.value;

            for(int var3 = 0; var3 < this.value.length; ++var3) {
                var1 = 31 * var1 + var2[var3];
            }

            this.hash = var1;
        }

        return var1;
    }
複製程式碼

這裡我用我的姓的拼音來演示下 馬(Ma) 在Ascii表中我們可以找到 Ma和編碼分別是 77 66 這樣算的就是(31*0+77)*31+66 資料有點少看不出來規律 再加上我的名 林(Lin) 76 69 110 這樣算起來就是

((((31*0+77)*31+66)*31+76)*31+69)*31+110
複製程式碼

這樣我們就可以總結出來規律啦

31*31(n-1)+str.charAt(0)*31(n-2)+str.charAt(1)*31(n-3)+...+str.charAt(n-1)
複製程式碼

其中的(n-*)代表根次方

這樣我們就可以看出來了 如果構造相鄰倆個最後的和一樣 我們設比較的兩個字串的編碼形式為 (x1)(y1)(x2)(y2) 他們倆只有中間倆個字元的編碼不一樣 那麼怎麼分別設定這兩個字串才能讓他們的編碼最後相同呢 經過一番高考之前的我附身 我們可以得到以下的等式

最最重要的是

(x1-x2)*31=(y2-y1)
複製程式碼

也就是相鄰的兩位如果前邊的編碼差 1 後邊的兩個的編碼就要差 -31*1

倆個例項吧 還是上邊的我的大姓 Ma 有哪個字串是和 M(77)a(97) Hashcode相同的呢 其中一個結果竟然為 NB(敲黑板) N(78)B(66) 看起來我們這個姓比較厲害了

相關文章