Java中的equals()方法用于比较两个对象是否是相同的,而hashCode()则用于给对象生成一个唯一的哈希值。在某些情况下,需要重写这两个方法来确保正确的对象比较和哈希码生成。
默认情况下,Java对象的equals()方法比较的是对象的引用。也就是说,只有当两个对象的引用指向同一个内存地址时,它们才被认为是相同的。但是在实际场景中,很多情况下需要比较的是对象的某些属性。例如,比较两个人是否是同一个人,应该比较的是它们的身份证号码,而不是它们在内存中的地址。
因此,我们需要重写equals()方法,以便在对象比较时比较它们的属性值而不是引用地址。而hashCode()方法与之配合使用,它生成的哈希值用于快速比较两个对象是否相等,从而提高了程序的性能。
下面是一个Person类示例,其中重写了equals()方法:
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person person = (Person) obj;
return this.name.equals(person.name) && this.age == person.age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
在上面的例子中,equals()方法首先检查两个对象是否是同一个引用,如果是则返回true。然后检查传入的对象是否是Person类型,如果不是则返回false。最后比较两个对象的属性值,如果相等则返回true。
在HashCode()方法中,使用了Java 7新增的Objects.hashCode(Object…values)方法,它可以根据属性值来生成哈希码值。
hashCode()方法的重写要求同一个类的两个对象必须生成同样的哈希码值,如果生成不同的哈希值,那么在使用哈希表等数据结构时就会出现错误。
下面是一个User类示例,其中重写了hashCode()方法:
public class User {
private String username;
private String password;
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof User)) {
return false;
}
User user = (User) obj;
return this.username.equals(user.username) && this.password.equals(user.password);
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + username.hashCode();
result = 31 * result + password.hashCode();
return result;
}
}
在上面的例子中,hashCode()方法中组合了username和password属性的哈希值,采用了经典的31倍数加法算法,这种算法能够避免生成相同的哈希值。