首先自己问自己:为啥重写equals方法时应该总是重写hashCode方法???
1.不重写hashCode方法代码:
public class Person {
private int age;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
// @Override
// public int hashCode() {
// return Objects.hash(age, name);
// }
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
person.setName("李四");
person.setAge(1);
Person person1 = new Person();
person1.setName("李四");
person1.setAge(1);
Map<Object,String> map = new HashMap<>();
map.put(person1,"person1");
map.put(person,"person");
// System.out.println(person1.equals(person));
System.out.println(map);// 这里是两个对象
}
}
打印结果:map的对象是两个,如果是同一个对象则map里只保留一个
{com.example.alibaba.test.Person@7a4f0f29=person, com.example.alibaba.test.Person@bebdb06=person1}
Process finished with exit code 0
2.重写hashCode方法代码:
public class Person {
private int age;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
打印结果:map里存储对象是一个
{com.example.alibaba.test.Person@cdd2d=person}
Process finished with exit code 0
总结:判断一个类是否是同一个对象的时候,光重写equals方法是不行的。
一个好的哈希函数往往会为不相等的实例生成不相等的哈希码。(感兴趣的同学找找hashmap工作原理资料,高频率面试题)
- 不要试图从哈希码计算中排除重要的属性来提高性能。
- 不要为 hashCode 返回的值提供详细的规范,因此客户端不能合理地依赖它;你可以改变它的灵活性。
最后说下,重写hashCode可以用@注解来手动编写也可以用ide软件提供的方法(快捷键Alt+ins,选中对应方法即可)
所有文章无条件开放,顺手点个赞不为过吧!