美文网首页Java
Java HashSet源码分析(JDK 1.8)

Java HashSet源码分析(JDK 1.8)

作者: 小怪兽大作战 | 来源:发表于2019-03-20 20:08 被阅读4次

    首先看一下HashSet的继承关系。


    未命名文件.png

    HashSet实现了set接口,内部使允许有重复的值。

    成员变量

    private transient HashMap<E,Object> map;
    
    private static final Object PRESENT = new Object();
    

    可以看到HashSet内部有两个成员变量,HashMap和Object。

    构造方法

      public HashSet(Collection<? extends E> c) {
            map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
            addAll(c);
        }
    
        public HashSet(int initialCapacity) {
            map = new HashMap<>(initialCapacity);
        }
    
        HashSet(int initialCapacity, float loadFactor, boolean dummy) {
            map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }
    

    HashSet的构造方法都创建了HashMap对象。

    add(Object o)

        public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }
    

    在HashSet的add方法中直接调用了map的put方法,key值就是我们添加的对象,value值是成员变量,也就是一个Object对象。
    因此,HashSet内部是使用HashMap来实现的,存放的key就是我们添加的对象,存放的value就是一个Object对象。

    remove(Object o)

        public boolean remove(Object o) {
            return map.remove(o)==PRESENT;
        }
    

    contains(Object o)

        public boolean contains(Object o) {
            return map.containsKey(o);
        }
    

    其他方法都是基于HashMap来实现的,就不多说了。
    总结:HashSet内部有一个HashMap,每放入一个A,就在内部的HashMap中放入这样一个结点:他的key是需要放入的对象,value是一个Object类型的成员变量。

    相关文章

      网友评论

        本文标题:Java HashSet源码分析(JDK 1.8)

        本文链接:https://www.haomeiwen.com/subject/gbotvqtx.html