一个庸俗的实现:HashSet

我们知道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);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值