我们知道HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图,因为HashSet直接利用HashMap,所以实现非常简单,这个类其实就是一个使用HashMap的例子,
根本就没有什么值得分析的。
由于不用使用HashMap的value集合,所以所有的value都是同一个值(一个没有用的对象,但是不是null),这里之所以不为null是有道理的。如果用null的话,add和remove方法可能会有问题,因为HashMap的put和remove方法如果返回
null,我们无法判断是否增加了或者删除了(不存在返回null,存在返回value值)。
有关HashMap:http://blog.csdn.net/treeroot/archive/2004/09/20/111104.aspx
HashSet的声明如下:
public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable
有关AbstractSet:http://blog.csdn.net/treeroot/archive/2004/09/21/112219.aspx
有关Set: http://blog.csdn.net/treeroot/archive/2004/09/18/109065.aspx
有关Cloneable:http://blog.csdn.net/treeroot/archive/2004/09/07/96936.aspx
static firialVersionUID = -5024744406713321676L;
private transient HashMap map;//HashSet直接引用了一个HashMap
private static final Object PRESENT = new Object();
//作为HashMap的value值,没有任何用处。
public HashSet() {
map = new HashMap();
}
public HashSet(Collection c) {
map = new HashMap(Math.max((int) (c.size()/.75f) + 1, 16));
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);
}
public Iterator iterator() {
return map.keySet().iterator();
}
public int size() {
return map.size();
}
public boolean isEmpty() {
return map.isEmpty();
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean add(Object o) {
return map.put(o, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public void clear() {
map.clear();
}
public Object clone() {
try {
HashSet newSet = (HashSet)super.clone();
newSet.map = (HashMap)map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
private synchronized void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
s.defaultWriteObject();
Write out HashMap capacity and load factor
s.writeInt(map.capacity());
s.writeFloat(map.loadFactor());
s.writeInt(map.size());
for (Iterator i=map.keySet().iterator(); i.hasNext(); )
s.writeObject(i.next());
}
private synchronized void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
int capacity = s.readInt();
float loadFactor = s.readFloat();
map = (this instanceof LinkedHashSet ? new LinkedHashMap(capacity, loadFactor) :
new HashMap(capacity, loadFactor));
int size = s.readInt();
for (int i=0; i<size; i++) {
Object e = s.readObject();
map.put(e, PRESENT);
}
}