zoukankan      html  css  js  c++  java
  • HashSet源码阅读

    HashSet的实现基于HashMap

    看几个简单的初始化方法

        public HashSet() {
            map = new HashMap<>();
        }
        public HashSet(Collection<? extends E> 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);
        }

    可以看到HashSet的所有初始化,其实都在初始化hashmap,可以看出HashSet和HashMap是has-a的形式。最后一个初始化的是使用LinkedHashMap,dummy参数只是为了做区分构造函数,可以忽略。

    看一个HashSet的add操作

        private static final Object PRESENT = new Object();
        public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }

    可以看出,add时,将添加的元素作为hashmap的键值,PERSENT作为默认的值,put到map中。

    例如contains、remove等类似的处理,将值作为map的key值在map中操作。

    不过HashSet继承了AbstractSet,AbstractSet继承了AbstractCollection。

    例如刚刚的构造函数里有个addAll方法,调用的是父类AbstractCollection中的addAll方法

        public boolean addAll(Collection<? extends E> c) {
            boolean modified = false;
            for (E e : c)
                if (add(e))
                    modified = true;
            return modified;
        }

    而add(e)在HashSet又得到了重写。

    再看看LinkedHashSet这个类,这个类的构造函数都调用父类HashSet的特殊构造方法

        public LinkedHashSet(int initialCapacity, float loadFactor) {
            super(initialCapacity, loadFactor, true);
        }
        public LinkedHashSet(int initialCapacity) {
            super(initialCapacity, .75f, true);
        }
        public LinkedHashSet(Collection<? extends E> c) {
            super(Math.max(2*c.size(), 11), .75f, true);
            addAll(c);
        }

    而HashSet这个构造方法是通过使用LinkedHashMap来实现的

  • 相关阅读:
    50个jQuery 插件可将你的网站带到另外一个高度
    Web 开发中 20 个很有用的 CSS 库
    【算法】1、约瑟夫环
    智造微博
    银河系中央超大黑洞可能是个虫洞 其连接着两个不同的时空。
    创意文案:我害怕阅读的人
    解决Oracle ORA-00984: column not allowed here
    舌尖上的程序员
    技术贴 本地代码与svn关联教程 svn upgrade问题解决
    Aimp3的播放列表 按评分排序 落雨
  • 原文地址:https://www.cnblogs.com/dj3839/p/8296735.html
Copyright © 2011-2022 走看看