package Homework1;

import java.util.HashSet;
import java.util.Objects;

public class test {
public static void main(String[] args) {
HashSet set = new HashSet();
Person person1 = new Person(1001,"aa");
Person person2 = new Person(1002,"BB");
set.add(person1);
set.add(person2);
person1.name="CC";
long i=person1.hashCode();
set.remove(person1);
//remove是根据hash值来索引删除的,由于重写了hashcode和equals方法,更换内部属性后,hash值发生改变,
// 但是因为已经存进去了,所以remove索引时索引到的地方是person1的新hash值,该位置为空,所以删不掉
System.out.println(set);//输出三个

set.add(new Person(1001,"CC"));
//虽然前面person1改成了1001和CC,正常来说hash值一样,存放的位置一样,但是由于person1已经存放进去了,位置改变不了,所以该hash值定位到的位置为空
System.out.println(set);//输出四个

set.add(new Person(1001,"AA"));
//这里会hash值等于没有改成CC前的person1的hash值,由于person1的位置没有改变,就是定位到person1的位置,但是由于person1发生了改变,与现在的这个新Person不一样,所以不一样
System.out.println(set);//输出五个

}
}
class Person{
public int id;
public String name;

public Person(int id, String name) {
this.id = id;
this.name = 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 id == person.id && Objects.equals(name, person.name);
}

@Override
public int hashCode() {
return Objects.hash(id, name);
}
}