equals与hashCode
在Java中,重写 equals() 方法时,通常也需要重写 hashCode() 方法,这是因为在Java中,如果两个对象相等(即 equals() 方法返回true)
,它们的哈希码应该相等,即 hashCode() 方法返回的哈希码应该一致。这是为了保证当两个对象放入基于哈希码的集合中(如HashMap、HashSet)时,当集合要添加新的对象时
,先调用这个对象的hashCode方法,得到对应的hashCode
值,会跟之前存在对象的hashCode进行比对,从而能使它们被正常识别和存储,同时也提高了效率。
通用原则:equals相同的两个对象hashcode必须相同
代码示例如下:
import java.util.Objects;class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}public class EqualsAndHashCodeExample {public static void main(String[] args) {Person person1 = new Person("Alice", 30);Person person2 = new Person("Alice", 30);System.out.println("person1.equals(person2): " + person1.equals(person2));System.out.println("person1.hashCode(): " + person1.hashCode());System.out.println("person2.hashCode(): " + person2.hashCode());}
}
在上面的代码中,我们重写了 equals() 方法来比较两个 Person 对象的 name 和 age
字段是否相等,同时重写了 hashCode() 方法来生成哈希码。在 main 方法中,我们创建了两个 Person 对象 person1 和 person2 ,它们的 name 和 age 字段相等。通过调用 equals() 方法比较它们的相等性,并打印出哈希码的值,可以看到因为重写了 hashCode() 方法, person1 和 person2 的哈希码是相等的。
上一篇 Java常见的判空方式汇总 | 欢迎点赞、收藏、评论!!! | 下一篇 Java——原码、反码、补码、位运算。 |