HashSet是Set集合的一种,Set集合是一种不允许出现重复值的集合,可以用来作为去重。
1、构造函数
private transient HashMap<E,Object> map; //内部的一个HashMap数据成员
private static final Object PRESENT = new Object(); //Object的对象,辅助作用的一个数据成员
public HashSet() {
map = new HashMap<>(); //初始化一个HashMap对象
}
HashMap里面只有两个变量,一个HashMap类型的map,一个是辅助作用的Object对象PRESENT;无参构造方法是直接创建了一个HashMap对象赋值给map;
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); //获取16和size/0.75的最大值作为初始化容量
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor); //创建LinkedHashMap对象
}
这是另外四个构造函数,可以看出其实HashSet构造函数就是创建一个相应容量的HashMap对象(还有一个LinkedHashMap对象);
2、其它方法
public boolean add(E e) {
return map.put(e, PRESENT)==null; //添加方法,调用HashMap的put方法,value是内部的一个finale成员变量,Object对象
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT; //删除方法
}
public Iterator<E> iterator() {
return map.keySet().iterator(); //返回map中key的迭代器
}
public int size() {
return map.size(); //获取集合的size
}
public boolean isEmpty() {
return map.isEmpty(); //判断是否为空
}
public boolean contains(Object o) {
return map.containsKey(o); //是否包含对象
}
public void clear() {
map.clear(); //清空集合
}
通过上面的方法可以发现,其实HashSet就是一个HashMap,全部的方法都是在内部调用了HashMapd的对应方法,只是HashSet没有value的概念,它是借用了HashMap的key来实现不可重复的一个集合。我们完全可以把HashSet对象看成一个value都是Object对象的HashMap对象;具体查看 Java从入门到放弃(十)集合框架之HashMap源码(1)的HashMap的源码讲解;这里不再介绍。