HashSet不允许重复值,为什么修改后再添加一个一样的就可以。代码输出

代码:
@Test
public void test2() {
HashSet<UserPojo> set = new HashSet<>();
UserPojo p1 = new UserPojo("AA", 1001);
set.add(p1);
p1.setName("CC");
set.remove(p1);
/*在调用 set.remove(p1) 时,并不会删除原先的 p1,这是因为 HashSet 在执行 remove 操作时,会根据对象的 hashCode 和 equals 方法
来判断对象的唯一性和是否存在的。当你修改了对象的属性(比如 p1.name = "CC"),这可能会导致对象的 hashCode 改变,因此 HashSet 在内部
寻找该对象时会用新的 hashCode 进行查找,导致可能找不到原始的对象。*/
UserPojo p3 = new UserPojo("CC",1001);
set.add(p3);
UserPojo p4 = new UserPojo("AA",1001);
set.add(p4);
System.out.println(set);
System.out.println(p1.hashCode()==p3.hashCode());
System.out.println(p3.equals(p1));
System.out.println(p4.hashCode());
}
static class UserPojo {
private String name;
private int 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;
}
public UserPojo(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "UserPojo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof UserPojo userPojo)) return false;
return getAge() == userPojo.getAge() && Objects.equals(getName(), userPojo.getName());
}
@Override
public int hashCode() {
return Objects.hash(getName(), getAge());
}
}