大家都知道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表中我們可以找到 M
和a
和編碼分別是 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)
看起來我們這個姓比較厲害了