使用Map的对象必须正确覆写equals()方法和hashCode()方法
必须满足以下要求
1、正确覆写equals(),相等的两个key实例必须返回true。
2、正确覆写hashCode()方法,相等的两个key实例hashCode必须相等,不相等的两个key实例hashCode尽量不要相等。
总结:
| equals() | hashCode() | |
|---|---|---|
| 实例相等 | true | 相等 |
| 实例不相等 | false | 尽量不相等 |
二、编写如果两个实例不相等,但hashCode一致,Map对于散列表冲突有解决方法,例如拉链法。但这会增加复杂度,因此尽量不要相等。
1、equals()
1、找出需要比较的字段
2、用instanceof判断传入的待比较的Object是不是当前类型
3、引用类型用Objects.equals()比较,基本类型用==比较
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
2、hashCode
public class Person {
String name;
int age;
@Override
int hashCode() {
int h = 0;
h = 31 * h + name.hashCode();
h = 31 * h + age;
return h;
}
}
若name为null,会抛出NullPointerException
借助Objects.equals()比较
int hashCode() {
return Objects.hash(name, age);
}



