在集合使用中,我们经常会用到HashSet,一般用于过滤一组数据,保证数据唯一。今天看一下HashSet的源码,之前看过HashMap,再来看,HashSet可以说是很简单了。
源码分析
初始化
-
底层是通过HashMap存储数据的。
-
PRESENT成员变量用于HashMap的value值
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
增删改查操作
- 增加操作
public boolean add(E e) {
return map.put(e, PRESENT)==null;//判断是否首次插入数据
}
- 删除操作
public boolean remove(Object o) {
return map.remove(o)==PRESENT;//判断删除的数据是否预给定的数据
}
- 数据查询(通过HashMap主键遍历)
public Iterator<E> iterator() {
return map.keySet().iterator();
}
总结
-
通过上面其实也不难看出来,HashSet和HashMap的缘分不浅。
-
HashSet中存储的数据是存放在HashMap的key,value都是同一个静态成员变量;
-
由于上面说的特性,HashSet中存放的数据是不会出现重复的现象。
-
也因为本质其实是HashMap进行处理,所以会有对编程而言,数据存放是“无序”而内部实质是“有序”的情况。
-