上两节分别讲了下Hashtable/HashMap的基本知识,这次轮到HashSet
Hashtable和HashMap都提供key-value存储查询功能,HashSet略微不同,HashSet只提供key的不重复存储/查询功能。
简单的看下源码:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
}
HashSet内部属性 private transient HashMap<E,Object> map;
这其实就是HashSet的数据存储集合。
看下简单的add/contains方法
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashSet巧妙的运用了一个常量 PRESENT对象作为value,
private static final Object PRESENT = new Object();
综上所述,HashSet依赖HashMap实现了key的不重复添加。