JDK源代码分析聚集篇-------Set分析(我们大家都是第一无二的)

来源:互联网 发布:mac笔记本电脑 编辑:程序博客网 时间:2024/04/19 23:05
我们已经分析过了map和Collection接口,我们知道Set和List不同的是,Set不可以有相同的元素,那么判断这个元素是否相同是如何实现的呢,我们看下下面这张图:



从这张类图上,我们看见一个经典模式的应用,那就是适配器模式,我们把map接口的对象,包装成为了Set的接口;在代码中,我们来分析一下;

首先,我们看一下HashSet
  1.  private transient HashMap<E,Object> map;
  2.     // Dummy value to associate with an Object in the backing Map
  3.     private static final Object PRESENT = new Object();
可见,他适配了HashMap,那么他的功能是如何委托给HashMap结构的呢?

  1.  public boolean add(E e) {
  2.     return map.put(e, PRESENT)==null;
  3.     }
在hashMap中,我们大多数时候是用value,但是在set的时候,却很好的利用了已有类HashMap,他利用了HashMap的key的唯一性来保证存储在Set中的元素的唯一性;

private static final Object PRESENT = new Object();

是这个HashMap所有key的value,他只是一个形式,而我们真正的数据是存在在key中的资源;

我们最后拿到的迭代器也是:

  1.   public Iterator<E> iterator() {
  2.     return map.keySet().iterator();
  3.     }
map的keySet的迭代器;

同理,我们看看LinkedhashMap;

  1.  public LinkedHashSet(int initialCapacity, float loadFactor) {
  2.         super(initialCapacity, loadFactor, true);
  3.     }
  4.     /**
  5.      * Constructs a new, empty linked hash set with the specified initial
  6.      * capacity and the default load factor (0.75).
  7.      *
  8.      * @param   initialCapacity   the initial capacity of the LinkedHashSet
  9.      * @throws  IllegalArgumentException if the initial capacity is less
  10.      *              than zero
  11.      */
  12.     public LinkedHashSet(int initialCapacity) {
  13.         super(initialCapacity, .75f, true);
  14.     }
  15.     /**
  16.      * Constructs a new, empty linked hash set with the default initial
  17.      * capacity (16) and load factor (0.75).
  18.      */
  19.     public LinkedHashSet() {
  20.         super(16, .75f, true);
  21.     }

调用了父类的构造函数;构造函数如下:

  1.     HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  2.     map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
  3.     }
生出了LinkedHashMap;


同理,我们一样可见到treeMap的实现:

  1.     private transient NavigableMap<E,Object> m;
  2.     // Dummy value to associate with an Object in the backing Map
  3.     private static final Object PRESENT = new Object();
更多的,我们也可以理解他是一种桥接模式的一种变形,不过我想从意义上,我更愿意相信其是适配器的应用;


原创粉丝点击