1.定义
HashSet继承AbstractSet类,实现Set,Cloneable,Serializable接口。Set 接口是一种不包括重复元素的 Collection,它维持它自己的内部排序,所以随机访问没有任何意义。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
HashSet的底层是靠HashMap进行存储的,map中的key值中存储着set集合中的元素,不允许重复,而value值则使用PRESENT进行填充。
private transient HashMap<E,Object> map; // 定义一个Object对象作为HashMap的value值 private static final Object PRESENT = new Object();
HashSet的构造函数
//构造一个全新空的set,默认大小是16,默认装载因子是0.75
public HashSet() { map = new HashMap<>(); }
//构造一个包含指定集合中元素的新集合,使用默认的构造因子0.75,如果集合中的元素太少,就采用默认大小16
//如果Collection为空,则抛出空指针异常 public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
//构造一个具有指定初始大小和装载因子的HashSet public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } //构造一个指定初始大小和默认装载因子为0.75的HashSet public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } //该构造函数为此包私有,仅仅由子类LinkedHashSet使用,构造一个新的空链接哈希集合
//且指定大小和构造函数 HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
2.主要方法
因为HashSet是基于HashMap进行实现的,所以HashSet的方法实现比较简单,直接调用Map的函数即可。
//返回元素迭代器,元素以无特定顺序返回
public Iterator<E> iterator() {
return map.keySet().iterator();
}
//返回Set大小
public int size() {
return map.size();
}
//返回Set中是否为空
public boolean isEmpty() {
return map.isEmpty();
}
//返回集合中是否包含该元素
public boolean contains(Object o) {
return map.containsKey(o);
}
//添加元素到集合中,如果集合不包含该元素,则添加。如果包含,则集合保持不变并且返回。
//此时map中添加的value值是PRESENT,该对象是static final对象
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//如果集合包含该元素,则删除元素
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
//清空Set
public void clear() {
map.clear();
}
//Clone函数是浅复制,并没有复制元素本身
@SuppressWarnings("unchecked")
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
原文:https://www.cnblogs.com/xiaobaituyun/p/10573867.html