JDK源码之解读String最终类的equals()和hashcode()方法实现原理
最近在看JDK源码,先从简单入手,比如 String类 ,List、Map和Set接口的实现类。。。
1,equals().
“abd”.equals(“abc”)采取的是两字符串长度相等,在相等情况下,分别赋值给两字节数组,循环数组,如对应位置两数组值不相等,则return false;如都相等,则 return true. 源码如下:
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;
}
Stringstr=”ab”;
str.hashcode()==3105==(0*31+97)*31+98 //其中 97=a;98=b. a对应的ascii码=97。
把字符串分成字符数组,
用一个初始值为零的值,按公式 h=31*h+chararray[i] 在遍历该字符串时候,重复计算,最后的h值就是该字符串数组的hashcode()返回值。 源码如下:
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;
}