String重写的equals和hashcode方法分析
equals源代码+分析:
public boolean equals(Object anObject) {
//这里给anObject对象进行向上转型,转成了Object类,相当于加了层伪装
if (this == anObject) {
return true;
}
//可以看到,首先先对两个对象的地址值进行判断,
//如果地址值都一样,那么就不用进行下面的比较了,两个对象一定是相同的。
if (anObject instanceof String) {//instanceof 是一个运算符,
//就是判断前面的anObject是不是后面String类实例化的对象,
//如果是,则返回true,不是则false
String anotherString = (String)anObject;//由于前面转成了Object类,加了伪装
//,这里要强转回来,也就是转回原先的String类型对象
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;
}
hashcode方法源代码+分析:
public int hashCode() {
int h = hash;//这里是String对象的原本hash值
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];//遍历value字符数组,进行数值运算
}
hash = h;//将重新计算的hash值赋值给hash变量
}
return h;//返回重新计算的hash值
}