package set;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* @auto dh
* @create 2020-04-30-15:41
*/
class User {
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, 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 class HashSet003 {
public static void main(String[] args) {
Set<User> set = new HashSet<>();
User u1 = new User("zhangsan", 20);
User u2 = new User("lisi", 30);
set.add(u1);
set.add(u2);
//在 u1的hashCode 位置上age=22,
u1.setAge(22);
//删除是通过 new User("zhangsan",22)计算出的hashCode值去删除,此处不存在值,所以删除失败
set.remove(u1); //false
System.out.println(set);//[User{name='zhangsan', age=22}, User{name='lisi', age=30}]
//通过new User("zhangsan",22)计算出的hashCode值,在此hashCode位置上存值
set.add(new User("zhangsan",22));
System.out.println(set);//[User{name='zhangsan', age=22}, User{name='zhangsan', age=22}, User{name='lisi', age=30}]
//通过new User("zhangsan",20)计算出的hashCode值存值,虽然此处索引已存值,但是通过equals()比较出来的结果不相等,所以可以存入
set.add(new User("zhangsan",20));
System.out.println(set);//[User{name='zhangsan', age=22}, User{name='zhangsan', age=20}, User{name='zhangsan', age=22}, User{name='lisi', age=30}]
}
}