Java集合容器——HashSet

一,HashSet特点:

1.HashSet的实现完全依靠HashMap

2.元素没有顺序,不能重复

3.查找效率高

二,HashSet源码分析:

类定义:

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
//继承AbstractSet,实现Set, Cloneable,Serializable

成员变量:

private transient HashMap<E,Object> map;
//底层使用HashMap实现,因此存储结构就是个Map 
private static final Object PRESENT = new Object();
//由于HashSet只用到了HashMap的key,其值默认为PRESENT

构造方法:

public HashSet() {
    map = new HashMap<>();
}
//默认构造方法,创建一个默认的HashMap,即默认的容量是16,加载因子是0.75

public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}
//创建一个指定元素集合的set,容量必须足够放置c的所有元素

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
//创建指定容量和加载因子的Set

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
//创建指定容量的Set

常用方法:

1. public boolean add(E e)添加元素

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
//将元素值作为键,PRESENT常数作为值存入map中,由于map在put时会覆盖相同的键,因此hashset中元素时不重复的

2.public boolean remove(Object o)删除元素

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}
//直接调用map的删除方法删除元素

3. public Iterator<E> iterator()返回迭代器

public Iterator<E> iterator() {
    return map.keySet().iterator();
}
//返回map中key列的迭代器

其余方法几乎都是直接调用HashMap的方法,非常简单,详情可以看HashMap的介绍。

猜你喜欢

转载自blog.csdn.net/qq_41773240/article/details/87708278