美文网首页
jdk源码分析之HashSet

jdk源码分析之HashSet

作者: shoulda | 来源:发表于2018-06-25 20:21 被阅读0次

一.定义

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

HashSet继承与AbstractSet类,实现Set,Cloneable,Serializable接口。AbstractSet提供Set接口的骨干实现,从而最大限度的减少了实现此接口需要的工作。Set接口是一种不包括重复元素的Collection,它维持他自己的内部排序。

基本字段

//基于HashMap实现,底层使用HashMap保存所有元素
        private transient HashMap<E,Object> map;

        //定义一个Object对象作为HashMap的value
        private static final Object PRESENT = new Object();

构造函数

/**
         * 默认构造函数
         * 初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。
         */
        public HashSet() {
            map = new HashMap<>();
        }

        /**
         * 构造一个包含指定 collection 中的元素的新 set。
         */
        public HashSet(Collection<? extends E> c) {
            map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
            addAll(c);
        }

        /**
         * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子
         */
        public HashSet(int initialCapacity, float loadFactor) {
            map = new HashMap<>(initialCapacity, loadFactor);
        }

        /**
         * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
         */
        public HashSet(int initialCapacity) {
           map = new HashMap<>(initialCapacity);
        }


        HashSet(int initialCapacity, float loadFactor, boolean dummy) {
           map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }

从构造函数可以看出,HashSet所有的构造函数都是构造出一个HashMap。HashSet只用到了构造出的HashMap的key值,value固定为PRESENT对象,该对象为static final

二.方法

public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

iterator()方法返回对此set中元素进行迭代的迭代器。底层调用HashMap的keySet返回所有的key,这点反应了HashSet中的所有元素都是保存在HashMap的key中。

public int size() {
        return map.size();
    }

size()返回的是set中元素的个数。底层调用HashMap的size方法。返回HashMap容器中的大小。

public boolean isEmpty() {
        return map.isEmpty();
    }

isEmpty(),判断HashSet()集合是否为空。

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

contains(),判断某个元素是否存在于HashSet()中。

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

当此e存在与HashMap的key中,则value将会覆盖掉原有的value,但是key保持不变,所有这就满足了HashSet中元素不会重复的特性。

相关文章

网友评论

      本文标题:jdk源码分析之HashSet

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