Java编写equals和hashCode
一、原因
使用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);
}