HashSet是一个常见的集合类,底层使用HashMap实现。
HashMap保证key的不重复性,对于重复的key,HashMap会根据参数onlyIfAbsent的设置和原value是否为空两个条件来判断是否替换新value,但要注意的是,对于HashSet,这个value只是个空的Object类的对象,没有任何实际作用,HashSet中的元素实际上是存储在key上的。针对重复的key,HashMap只有对于value的处理,并不会替换key,因此在HashSet中加入相同元素不会覆盖。
public class HashSetTest{
public static void main(String[] args) {
User user1 = new User(1,"abc",20);
User user2= new User(1,"def",20);
Set<User> set = new HashSet<>();
set.add(user1);
set.add(user2);
Iterator<User> iterator = set.iterator();
while(iterator.hasNext()) System.out.println(iterator.next());
}
}
来看看输出结果:
User{id=1, name='abc', age=20}
总结:结果显然向HashSet中加入相同元素不会进行覆盖。因为HashSet底层使用HashMap实现,元素存在HashMap的key中。在HashMap中,多次put相同的key,只会覆盖value,而不存在key的情况。
(做笔记用!)