public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj) {
System.out.println("执行了吗");
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
@Override
public int hashCode() {
return 10;
}
}
测试类:
package com.heiam.mytest;
import java.util.HashSet;
import com.heiam.bean.Person;
public class Demo1_HashSet {
/**
* 注意:我们认为姓名和年龄都相同时表示时同一个人
* 如果:Person类中没有重写equals方法的话,无法去重,但是重写后还是无法去除重复的内容
* 因为HashSet判断元素是否重复,首先根据元素的hashCode值,而我们并没有重写Person类的hashCode方法,
* 此时调用的是Object中的hashCode方法,而此方法是根据对象的地址值计算hashCode值,而只要是new出来的对象,
* 地址值肯定不同,所以计算出来的hashCode值也不相同,就认为不是同一个对象,也不会执行equals方法
* 如果我们重写了hashCode方法,先简单的返回一个数字10,这样当判断hashCode相等时就会去判断equals方法的返回值,
* 就能够去除重复
* @param args
*/
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<>();
hs.add(new Person("张三", 23));
hs.add(new Person("张三", 23));
hs.add(new Person("李四", 24));
hs.add(new Person("李四", 24));
hs.add(new Person("李四", 24));
hs.add(new Person("李四", 24));
//System.out.println(hs.size());
System.out.println(hs);
}
} |
|