HashSet底层使用HashMap实现。
HashMap保证key的不重复性,value可以重复,对于重复的key,HashMap会根据参数onlyIfAbsent的设置和原value是否为空两个条件来判断是否替换新value,但要注意的是,对于HashSet,这个value只是个空的Object类的对象,没有任何实际作用,HashSet中的元素实际上是存储在key上的。针对重复的key,HashMap只有对于value的处理,并不会替换key,因此在HashSet中加入相同元素不会覆盖。
//User类
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id && age == user.age;
}
@Override
public int hashCode() {
return Objects.hash(id + age);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
//测试类
public class HashSetTest {
public static void main(String[] args) {
User user1 = new User(1, "abc", 20);
User user2 = new User(1, "def", 20);
HashSet<User> set = new HashSet<>();
set.add(user1);
set.add(user2);
System.out.println(set);
}
}
从结果可以看出,对于相同的对象,hashSet处理的办法并不是覆盖