版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36336003/article/details/83076539
equals:
- 判断this对象与anObject对象是否相等(
this == anObject
) - 判断anObject对象是否为类或其子类对象(
anObject instanceof String
) - 比较类中属性是否相等
基本类型,直接使用==判断
集合数组类型,遍历集合数组使用相应equals方法判断
引用数据类型,使用相应equals方法判断 - 重写equals方法是总要重写hashCode方法(Always override hashCode when you override equals)
如String类的equals方法:
// java.lang.String#equals
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;
}
hashCode:
- 定义int类型变量hashCode并赋值1(
int hashCode = 1;
) - 对于每个成员变量,进行如下计算hash code
c
(根据字段类型):
boolean:(f ? 1 : 0)
byte, char, short, int:(int) f
long:(int) (f ^ (f >>> 32))
float:Float.floatToIntBits(f)
double:Double.doubleToLongBits(f)
Object:(obj==null ? 0 : obj.hashCode())
- 对每个字段进行如下操作:
hashCode = 31 * hashCode + c;
- 返回hashCode(
return hashCode;
)
//java.util.AbstractList#hashCode
public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}