论坛元老
- 积分
- 4306
- 威望
- 0
- 金币
- 9168
- 贡献
- 0
- 注册时间
- 2022-7-17
- 最后登录
- 2022-8-27
|
人人为我,我为人人。登录后免费下载所有资源。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一言以蔽之:重写方法是为了比较对象的内容是否相等,重写方法是为了保证对象在哈希表等数据结构中的正确性。
1、在 Java 中,如果一个类重写了方法,则必须同时重写方法。这是因为在 Java 中,对象的值用于在哈希表(Hash Table)等数据结构中进行快速查找,而哈希表的实现原理是根据对象的值进行散列(Hash),所以如果两个对象的方法返回,则它们的值也必须相等,否则可能会导致哈希表的查询等操作出现错误结果。
以下是一个示例,演示了为什么需要同时重写和方法:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person person = (Person) obj;
if (age != person.age) return false;
if (name != null ? !name.equals(person.name) : person.name != null) return false;
return true;
}
}
如果只重写了方法,而没有重写方法,则可能会导致哈希表中出现错误的结果:
Person p1 = new Person("Alice", 18);
Person p2 = new Person("Alice", 18);
MapPerson, String map = new HashMap();
map.put(p1, "Hello");
// 此时尝试获取 p2 对应的值,由于没有重写 hashCode 方法,p1 和 p2 的 hashCode 值不相等
// 因此,虽然 p1 和 p2 的 equals 方法返回 true,但是从哈希表中获取 p2 对应的值时却会失败
String value = map.get(p2); // value 为 null
2、下面是一个重写了方法的示例代码:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person person = (Person) obj;
if (age != person.age) return false;
if (name != null ? !name.equals(person.name) : person.name != null) return false;
return true;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
在上面的示例代码中,方法重写的实现逻辑与方法的实现逻辑是一致的,都是比较对象的两个属性和是否相等,如果相等则返回相同的值。
需要注意的是,这里的是一个质数,它的作用是为了避免哈希冲突,因为的乘法运算比较快,而且相对来说能够更加均匀地散布哈希值,从而减少哈希冲突的发生。
重写了方法之后,就可以保证在哈希表等数据结构中,同一个对象的值不变,不同对象的值不同,从而能够正确地进行查找和比较操作。 |
|