Map/Set的key为自定义对象时,如何重写hashCode和equals。
时间: 2024-03-14 19:46:54 浏览: 65
当我们将自定义对象作为Map或Set的键时,由于需要寻找对应的键值对或元素,需要根据hashCode和equals方法来进行比较和匹配。因此,重写hashCode和equals方法是非常重要的。
在重写hashCode方法时,我们需要保证同一对象多次调用hashCode方法得到的返回值是相同的。一般来说,可以将对象中的每个字段的hashCode值相加,得到一个综合的hashCode值。
在重写equals方法时,我们需要保证同一对象与自身相等,即x.equals(x)为true;同时,我们需要满足以下条件:
1. 对象与null比较时返回false,即x.equals(null)为false;
2. 对象与其他类比较时返回false,即x.equals(y)为false,当且仅当x和y不是同一类型的对象;
3. 对象的字段值相等时返回true,即当且仅当x和y的每个字段都相等时,x.equals(y)为true。
下面是一个示例代码:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + age;
return result;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return this.name.equals(other.name) && this.age == other.age;
}
}
```
在这个示例中,我们重写了Person类的hashCode和equals方法,其中:
1. hashCode方法使用了31这个素数,常量17以及对象的每个字段的hashCode值相加的方式来计算综合的hashCode值。
2. equals方法首先判断了是否为null或同一对象;然后判断了是否为Person类的对象;最后比较了name和age字段的值是否相等。
阅读全文