讲在前面:之所以重写这两个方法,其目的是为了判断该对象是否唯一,以哪种方式判断其是唯一
java中的双列集合Map与单列集合Set存放自定义类实例化出来的对象时该类都要重写hashCode方法与equals方法。
以下以Set集合为例。
下面自定义一个Person类:
public class Person {
String name;
int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
然后Demo以下
public class demo {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("罗老师",20);
Person p2 = new Person("苍老师",18);
Person p3 = new Person("罗老师",20);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set);
}
}
现在我们想把年龄相同的当同一个元素对待,而且Set集合也不允许存在重复元素,否则后添加的将前面存在的替换
但是我们打印时会发现
p1和p3的姓名年龄完全相同,也被存储进入集合,感觉这违背了Set集合的原则阿,其实并不如此,因为如果自定义类没有重写hashCode和equals方法的话就以对象引用作为判断依据,而每一个实例化出来的对象地址都是不同的,故不作为重复元素处理
为了将年龄和名字相同的人当作同一个人处理,我们必须在Person类中重写hashCode和equals方法,在Person类加上如下代码完成重写
@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(name, age);
}
此时的打印结果只有一个罗老师。