JDK源代码分析聚集篇-------Set分析(我们大家都是第一无二的)
来源:互联网 发布:mac笔记本电脑 编辑:程序博客网 时间:2024/04/19 23:05
我们已经分析过了map和Collection接口,我们知道Set和List不同的是,Set不可以有相同的元素,那么判断这个元素是否相同是如何实现的呢,我们看下下面这张图:
从这张类图上,我们看见一个经典模式的应用,那就是适配器模式,我们把map接口的对象,包装成为了Set的接口;在代码中,我们来分析一下;
首先,我们看一下HashSet可见,他适配了HashMap,那么他的功能是如何委托给HashMap结构的呢?
在hashMap中,我们大多数时候是用value,但是在set的时候,却很好的利用了已有类HashMap,他利用了HashMap的key的唯一性来保证存储在Set中的元素的唯一性;
private static final Object PRESENT = new Object();
是这个HashMap所有key的value,他只是一个形式,而我们真正的数据是存在在key中的资源;
我们最后拿到的迭代器也是:
map的keySet的迭代器;
同理,我们看看LinkedhashMap;
调用了父类的构造函数;构造函数如下:
生出了LinkedHashMap;
同理,我们一样可见到treeMap的实现:
更多的,我们也可以理解他是一种桥接模式的一种变形,不过我想从意义上,我更愿意相信其是适配器的应用;
从这张类图上,我们看见一个经典模式的应用,那就是适配器模式,我们把map接口的对象,包装成为了Set的接口;在代码中,我们来分析一下;
首先,我们看一下HashSet
- private transient HashMap<E,Object> map;
- // Dummy value to associate with an Object in the backing Map
- private static final Object PRESENT = new Object();
- public boolean add(E e) {
- return map.put(e, PRESENT)==null;
- }
private static final Object PRESENT = new Object();
是这个HashMap所有key的value,他只是一个形式,而我们真正的数据是存在在key中的资源;
我们最后拿到的迭代器也是:
- public Iterator<E> iterator() {
- return map.keySet().iterator();
- }
同理,我们看看LinkedhashMap;
- public LinkedHashSet(int initialCapacity, float loadFactor) {
- super(initialCapacity, loadFactor, true);
- }
- /**
- * Constructs a new, empty linked hash set with the specified initial
- * capacity and the default load factor (0.75).
- *
- * @param initialCapacity the initial capacity of the LinkedHashSet
- * @throws IllegalArgumentException if the initial capacity is less
- * than zero
- */
- public LinkedHashSet(int initialCapacity) {
- super(initialCapacity, .75f, true);
- }
- /**
- * Constructs a new, empty linked hash set with the default initial
- * capacity (16) and load factor (0.75).
- */
- public LinkedHashSet() {
- super(16, .75f, true);
- }
调用了父类的构造函数;构造函数如下:
- HashSet(int initialCapacity, float loadFactor, boolean dummy) {
- map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
- }
同理,我们一样可见到treeMap的实现:
- private transient NavigableMap<E,Object> m;
- // Dummy value to associate with an Object in the backing Map
- private static final Object PRESENT = new Object();
- JDK源代码分析聚集篇-------Set分析(我们大家都是第一无二的)
- JDK源代码分析聚集篇-------TreeMap上(红黑树的研究);
- JDK源代码分析聚集篇-------Collection(文明人应该排队)
- JDK源代码分析聚集篇-------Collection(文明人应该排队)
- JDK源代码分析聚集篇-------Collections的线程安全(穿上交通协管员的制服)
- JDK源代码分析聚集篇-------TreeMap下(不按先后,只看谁牛逼,jdk中的红黑树);
- JDK源代码分析聚集篇-------HashMap(一队不够快,多排几队就是)
- JDK源代码分析聚集篇-------LinkedHashMap(排队不能光图快却不讲次序啊!总有个先来后到吧!)
- MongoDB的聚集分析
- MongoDB的聚集分析
- JDK HashMap源代码分析
- JDK HashMap源代码分析
- ecmall 源代码分析 (无内容)
- MTD源代码分析(二)
- eMule源代码分析(二)
- P2psim 源代码分析二
- Android ActionBar的源代码分析(二)
- Struts2源代码分析(二)类ContainerImpl的实现分析
- 衣服很好看
- 获得本月最后一天
- 今天开博客啦,博客定性
- ERP的管理思想
- 郁闷,怎么发的文没了?
- JDK源代码分析聚集篇-------Set分析(我们大家都是第一无二的)
- 马云经典语录
- JUnit 学习文档
- 页面距离位置整理
- 数据结构和算法分析实验(一)
- 从两通客服电话看支付宝和快钱
- 笔记081105 SET PATH WHICH WHEREIS HISTORY SHELL TR
- 把自己要做的事写出来,不要放在心里。
- 自由软件之父抛弃OLPC,支持中国的龙梦:教孩子们使用Windows无异于教他们抽烟