以上的hashcode方法该怎样重写
时间: 2024-09-22 21:06:42 浏览: 39
在Java中,当你重写`hashCode()`方法时,目的是为了确保当两个对象被视为“相等”(通过`equals()`方法)时,它们的散列码(hashCode)也应是相等的。这是一个原则性的约定,有助于提高散列表(如HashMap、HashSet)的性能,因为它们依赖于散列码来快速定位和查找元素。
下面是一个简单的例子,假设我们有一个名为`Person`的自定义类,包含姓名(name)和年龄(age)两个属性:
```java
class Person {
private String name;
private int age;
// 构造函数和其他成员变量省略...
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name) && age == person.age;
}
@Override
public int hashCode() {
int result = 17; // 初始化结果
result = 31 * result + name.hashCode(); // 使用名字的hashCode,加权
result = 31 * result + age; // 使用年龄,简单相加
return result;
}
}
```
在这个例子中,我们首先初始化了一个固定的基数(这里是17),然后将`name`的`hashCode`乘以这个基数并加上`age`,生成最终的散列码。这样做是为了确保当两个`Person`对象的`name`和`age`都相同时,它们的`hashCode`也是相同的。
记住,为了维护一致性,当`equals()`返回`true`时,`hashCode()`也应该返回相同的值;反之亦然。如果修改了对象的状态使得`equals()`返回`false`,那么`hashCode()`也应该相应地变化,否则可能会导致哈希冲突。
阅读全文