equals默认比较的是地址值,这个在==和equals比较那块就应该知道。
在HashMap和HashSet里用的话,要让equals比较自定义类的成员变量值。
public class Student {
private int num;
public Student(int num) {
this.num = num;
}
@Override
public int hashCode() {
return num;
}
@Override
public boolean equals(Object obj) {
if(this==obj)
return true;
if(obj instanceof Student){
if (((Student) obj).num==num)
return true;
}
return false;
}
}
Integer的
@Override
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
String的
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;
}
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重写时要让它返回成员变量值,equals比较的也是成员变量值,那他俩功能岂不是一样了?都是比较成员变量值了。
hashcode返回的不一定是准确的成员变量值,equals是准确比较成员变量的值。
String的hashCode是所有数组元素相加,两个String的hashCode相等时,数组元素顺序不一定相等,所以需要equals来一个元素一个元素的比较。
Integer的hashCode就和equals完全一样了