要求:创建HashSet并添加三个Employee对象,如果两个Employee的名字和年龄的值一样,那么判定认为是相同员工,不能添加到HashSet中。
1、创建HashSet
Set set = new HashSet();
2、创建Employee
class Employee{
private int id;
private int age ;
private String name;
private String address;
public Employee(int id, int age, String name, String address) {
this.id = id;
this.age = age;
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
3、Alt + Insert 重写hashCode和equals
next后,勾选需要判断是否相同的值
如果name和age值相同,那么它的HashCode返回相同的结果
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return age == employee.age &&
Objects.equals(name, employee.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
注意:单纯的HashCode重写的话,新建多个Employee它会存在一个相同的链表上。
主程序
public class HashSetExercise {
public static void main(String[] args) {
//创建HashSet
HashSet set = new HashSet();
set.add(new Employee(1,12,"jack","江西"));
set.add(new Employee(2,12,"jack","湖南"));
set.add(new Employee(3,12,"rose","湖北"));
//使用迭代器
Iterator iterator = set.iterator();
//遍历
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
运行结果 id为1和id为2的name和age一样,所以他们哈希值相同,只能添加一个
分析HashSet添加元素
HashSet底层是HashMap。
1、添加一个元素时,先获取元素的哈希值(HashCode方法)
2、对哈希值进行运算,得到一个索引值即为要存放在哈希表中的位置号。
3、如果这个位置没有其他元素,则直接存放,如果有其他元素,就需要进行HashCode和equals比较,如果HashCode相同,equals不相同,以链表的形式添加,如果HashCode不相同,equals相同,索引值不同添加。两个相同便不再添加。