前言
HashSet是Set接口的一个实现类,实际上它是 hashMap 的实例,不保证顺序,且非线程安全的。 jdk 文档中也足以说明这一点。而HashSet常用的方法有add, remove, contains和size。

案例使用

源码分析
1、new HashSet<>();
// private transient HashMap <E,Object> map;
//这里也足以说明HashSet是个HashMap实例,那么是怎么实现的呢?
//下面会有分析
public HashSet() {
map = new Hash Map<>();
}
2、 java .util.HashSet#add
//这里直接调用了map的put方法,e就是key
//那么PRESENT是啥?原来PRESENT=new Object
// private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
3、java.util.HashSet#remove
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
4、java.util.HashSet#contains
public boolean contains(Object o) {
return map.containsKey(o);
}
5、java.util.HashSet#size
public int size() {
return map.size();
}
6、java.util.HashSet# Iterator
//说明 迭代器 是迭代了map的keySet
//从HashMap的源码分析可以知道,key是不可以重复的
//所以HashSet是不存在重复的值
public Iterator<E> iterator() {
return map.keySet().iterator();
}
总结
HashSet是HashMap的实例,HashSet存储的数据是不可重复的。且HashSet很多方法都直接调用HashMap的方法。HashSet的值是HashMap的key,而HashMap的值是一个Object。类似一个占位的作用。
喜欢这样做源码解析的同学,可以点赞、关注+收藏,后期还会推出其他框架源码分析。
如果有补充的地方,留言区见。