基本概念
hashCode()方法是Object类中的一个方法,这个方法的作用是返回一个hash值。
Object类中的hashCode()方法为一个native方法:
public native int hashCode();
为什么我们要重写hashCode()方法?
我们在自定义一个类时,往往需要重写Object类中的hashCode()方法,这是因为当使用HashSet这个容器存储对象时,如果该类不重写hashCode()方法,则HashSet不会对存储在里面的该类对象进行去重(即该类两个对象之间的各个属性值相等);事实上,只重写hashCode()方法是不行的,还需要重写equals()方法。(具体原因,我现在也不知道,等我读懂了HashMap的源码再补充上这个原因吧。。。如果你有兴趣的话,也可以读一下HashMap的源码);下面贴一下我重写的hashCode()方法和equals()方法(仅供参考):
自定义类Person:
class Person {
// 姓名
private String name;
// 年龄
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 重写equals()方法
* @param otherObject
* @return
*/
@Override
public boolean equals(Object otherObject) {
if (this == otherObject) {
return true;
}
if (otherObject == null) {
return false;
}
if (this.getClass() != otherObject.getClass()) {
return false;
}
Person other = (Person) otherObject;
return Objects.equals(this.name, other.name)
&& this.age == other.age;
}
/**
* 重写hashCode()方法
* @return
*/
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
测试类:
public class EqAndHaDemo {
public static void main(String[] args) {
Person p1 = new Person("name1", 23);
Person p2 = new Person("name1", 23);
// 放入set中
Set<Person> set = new HashSet<>();
set.add(p1);
set.add(p2);
System.out.println(set.size());
}
}
如果重写了equals()方法和hashCode()方法,该程序执行结果为1;重写任意方法的一个或者一个都不重写,该程序执行结果为2;有兴趣的可以自己注释掉Person类中的equals()方法或者hashCode()方法运行程序查看输出结果。