一、hashCode函數(shù)
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
hashCode()對字符串的哈希值是做了緩存的,第一次會創(chuàng)建哈希值,往后的則將使用緩存中的值。
使用的計(jì)算方法為:s[0]*31(n-1)+s[1]*31 (n-2)+....+s[n-1]
使用31作為基數(shù)
31 * i = 32 * i - i = (i<<5) - i 通過移位和減法運(yùn)算,有助于提高運(yùn)算速度。
31是質(zhì)數(shù)
一個(gè)對象如果存儲在散列集合內(nèi),需要復(fù)寫hashCode,因?yàn)樯⒘屑洗鎯ο笫歉鶕?jù)hashCode的值(相當(dāng)于地址)進(jìn)行存儲。
從函數(shù)的實(shí)現(xiàn)可以得到一個(gè)轉(zhuǎn)換成10進(jìn)制的工具:
public static int calculate(int radix, int[] a) { int sum = 0; for (int i = 0; i < a.length; i++) { sum = sum * radix + a[i]; } return sum; }
二、equals函數(shù)
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
重寫equals要遵守以下特征:
自反性:對于任何非null的引用值x, x.equals(x)必須返回true。
對稱性:對于任何非null的引用值x和y,當(dāng)且僅當(dāng)y.equals(x)返回true時(shí),x.equals(y)必須返回true
傳遞性:對于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true
對于任何非null的引用值x和y,只要equals的比較操作在對象中所用的信息沒有被修改,多次調(diào)用x.equals(y)就會一致地返回true,或者一致地返回false
對于任何非null的引用值x,x.equals(null)必須返回false
運(yùn)行流程:
先判斷是否自身對象
再判斷是否是String類實(shí)例(子類也算)
再判斷字符串長度
最后判斷對比每個(gè)字符
最后編輯于 :2017.12.06 04:55:38
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。