一、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)建哈希值,往后的則將使用緩存中的值沟使。
使用的計算方法為:s[0]*31(n-1)+s[1]*31 (n-2)+....+s[n-1]
使用31作為基數(shù)
31 * i = 32 * i - i = (i<<5) - i 通過移位和減法運算青扔,有助于提高運算速度晓猛。
31是質(zhì)數(shù)
一個對象如果存儲在散列集合內(nèi),需要復(fù)寫hashCode险领,因為散列集合存儲對象是根據(jù)hashCode的值(相當(dāng)于地址)進行存儲侨舆。
從函數(shù)的實現(xiàn)可以得到一個轉(zhuǎn)換成10進制的工具:
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時挨下,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
運行流程:
先判斷是否自身對象
再判斷是否是String類實例(子類也算)
再判斷字符串長度
最后判斷對比每個字符
最后編輯于 :2017.12.06 04:55:38
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者